Один и тот же объект Powershell WMI и CIM возвращает разные атрибуты свойств

Я пытаюсь преобразовать сценарий на основе WMI в CIM, этот сценарий может вводить IP-адрес в исходный сценарий Hyper-V Virtual Mahine: http://www.ravichaganti.com/blog/?p=2766

В моем случае я преобразовал предложения WMI в CIM следующим образом:

$vmname="mytestvm"
        $vm=get-ciminstance -namespace 'root\virtualization\v2' -Class 'Msvm_ComputerSystem' -ComputerName $ComputerName | Where-Object { $_.ElementName -eq $vmname } 
          $VMSettings = get-cimassociatedinstance $vm -resultclassname 'Msvm_VirtualSystemSettingData' | Where-Object { $_.VirtualSystemType
    -eq 'Microsoft:Hyper-V:System:Realized' }   
          $vmnetadapters=get-cimassociatedinstance $vmSettings -resultclassname 'Msvm_SyntheticEthernetPortSettingData'

          $NetworkSettings = @( Get-CimAssociatedInstance $vmnetadapters -resultclassname 'Msvm_GuestNetworkAdapterConfiguration' )

До этого момента все работает нормально, доступ к данным есть, и я могу видеть характеристики интерфейса. Но когда я пытаюсь установить значение, как это делает исходный сценарий, я не могу его изменить, он сообщает мне, что свойство установлено как «Только для чтения».

Эти назначения не работают.

  $NetworkSettings[0].DHCPEnabled = $false
  $NetworkSettings[0].IPAddresses = $IPAddress
  $NetworkSettings[0].Subnets = $Subnet

И когда я проверял объект с помощью «Get-Member», я мог видеть, что эти свойства имеют только метод «получить», а метод «установить» недоступен.

Name             MemberType Definition
----             ---------- ----------
DefaultGateways  Property   string[] DefaultGateways {get;}
DHCPEnabled      Property   bool DHCPEnabled {get;}
DNSServers       Property   string[] DNSServers {get;}
InstanceID       Property   string InstanceID {get;}
IPAddresses      Property   string[] IPAddresses {get;}
IPAddressOrigins Property   uint16[] IPAddressOrigins {get;}
ProtocolIFType   Property   uint16 ProtocolIFType {get;}
PSComputerName   Property   string PSComputerName {get;}
Subnets          Property   string[] Subnets {get;}

Оригинальный сценарий, использующий WMI, может изменять эти значения, но это невозможно, когда я использую CIM.

Согласно Microsoft WMI и CIM должны быть эквивалентны, но, похоже, есть некоторые различия.

Как я могу изменить эти свойства только для чтения, используя предложения CIM?

Заранее спасибо.


person Uh Trog    schedule 07.11.2016    source источник


Ответы (2)


Если вы работаете с командлетами CIM и хотите внести изменения, используйте set- ciminstance для фактического внесения изменений.

person Mike Garuccio    schedule 07.11.2016
comment
Я уже пробовал, но безуспешно. Объект CIM, который я получаю, является ассоциированным экземпляром. Я видел, что у него есть CiminstanceProperties, и если я ссылаюсь на: $properties=(Get-CimAssociatedInstance $vmnetadapters -resultclassname 'Msvm_GuestNetworkAdapterConfiguration').CimInstanceProperties $properties[DHCPEnabled].value=$False - person Uh Trog; 08.11.2016

Set-CimInstance не работает со свойствами, доступными только для чтения. Вам нужно будет вызвать Invoke-CimMethod. См. разделы Вызов методов CIM с помощью PowerShell и SetTcpipNetbios (скопировано для справки ниже) для примера использования.

# define the arguments you want to submit to the method
# remove values that you do not want to submit
# make sure you replace values with meaningful content before running the code
# see section "Parameters" below for a description of each argument.
$arguments = @{
    TcpipNetbiosOptions = [UInt32](12345)  # replace 12345 with a meaningful value
}


# select the instance(s) for which you want to invoke the method
# you can use "Get-CimInstance -Query (ADD FILTER CLAUSE HERE!)" to safely play with filter clauses
# if you want to apply the method to ALL instances, remove "Where...." clause altogether.
$query = 'Select * From Win32_NetworkAdapterConfiguration Where (ADD FILTER CLAUSE HERE!)'
Invoke-CimMethod -Query $query -Namespace Root/CIMV2 -MethodName SetTcpipNetbios -Arguments $arguments |
Add-Member -MemberType ScriptProperty -Name ReturnValueFriendly -Passthru -Value {
  switch ([int]$this.ReturnValue)
  {
        0        {'Successful completion, no reboot required'}
        1        {'Successful completion, reboot required'}
        64       {'Method not supported on this platform'}
        65       {'Unknown failure'}
        66       {'Invalid subnet mask'}
        67       {'An error occurred while processing an Instance that was returned'}
        68       {'Invalid input parameter'}
        69       {'More than 5 gateways specified'}
        70       {'Invalid IP  address'}
        71       {'Invalid gateway IP address'}
        72       {'An error occurred while accessing the Registry for the requested information'}
        73       {'Invalid domain name'}
        74       {'Invalid host name'}
        75       {'No primary/secondary WINS server defined'}
        76       {'Invalid file'}
        77       {'Invalid system path'}
        78       {'File copy failed'}
        79       {'Invalid security parameter'}
        80       {'Unable to configure TCP/IP service'}
        81       {'Unable to configure DHCP service'}
        82       {'Unable to renew DHCP lease'}
        83       {'Unable to release DHCP lease'}
        84       {'IP not enabled on adapter'}
        85       {'IPX not enabled on adapter'}
        86       {'Frame/network number bounds error'}
        87       {'Invalid frame type'}
        88       {'Invalid network number'}
        89       {'Duplicate network number'}
        90       {'Parameter out of bounds'}
        91       {'Access denied'}
        92       {'Out of memory'}
        93       {'Already exists'}
        94       {'Path, file or object not found'}
        95       {'Unable to notify service'}
        96       {'Unable to notify DNS service'}
        97       {'Interface not configurable'}
        98       {'Not all DHCP leases could be released/renewed'}
        100      {'DHCP not enabled on adapter'}
        default  {'Unknown Error '}
    }
}
person Gao    schedule 02.01.2021