Как получить IP-адрес виртуальной машины Windows 2008 R2 на Hyper-V с PowerShell?
Я создал сценарий автоматической сборки для создания новых виртуальных машин на Hyper-V 2016. Иногда мне нужна виртуальная машина 2008 R2, и способ получения IP-адреса для подключения к моим виртуальным машинам 2012 R2/2016 заключается в использовании некоторого PowerShell, например:
get-vm -Name $VMName|Get-VMNetworkAdapter|Select-Object -ExpandProperty IpAddresses
Отлично работает на 2012/2016, но возвращает пустой массив с виртуальной машиной 2008 R2. Любые идеи о том, как получить IP-адрес от Hyper-V с Powershell? Сценарий выполняется с рабочей станции Windows 10.
РЕДАКТИРОВАТЬ
Я старался get-vm -name $VMName|Get-WmiObject -Class Win32_NetworkAdapterConfiguration
в качестве теста и получил это после большого количества выходов адаптера:
Get-WmiObject: входной объект не может быть привязан ни к каким параметрам для команды, так как команда не принимает конвейерный ввод или ввод и его свойства не соответствуют ни одному из параметров, принимающих конвейерный ввод.
РЕШЕНИЕ
Это то, что я в итоге сделал:
$VMName = <the name of my vm>
Invoke-Command -Session $VMHostSession -ScriptBlock {
$Vm = Get-WmiObject -Namespace root\virtualization\v2 -Query "Select * From Msvm_ComputerSystem Where ElementName='$using:VMName'";
$vm.GetRelated("Msvm_KvpExchangeComponent").GuestIntrinsicExchangeItems | % { `
$GuestExchangeItemXml = ([XML]$_).SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Name']/VALUE[child::text()='NetworkAddressIPv4']");
if ($GuestExchangeItemXml -ne $null)
{
$GuestExchangeItemXml.SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child::text()").Value;
}
}
}
1 ответ
Вы могли бы использовать WMI для этого. Возможно 2008R2 не имеет поля, которое вы ищете.
get-vm -Name $VMName | Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_ | select-object IPAddress
Вам также может потребоваться выполнить некоторую фильтрацию на сетевой карте, которую вы выбираете, если у вас есть несколько магазинов. Вам также может понадобиться проверить, что выводит get-vm, так как я не уверен, что он будет направлен напрямую в get-wmiobject. Возможно, вам придется передать его на foreach-объект и получить имя компьютера таким образом.
****РЕДАКТИРОВАТЬ****
get-vm -Name $VMName | foreach-object { Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_.name } | select-object IPAddress
Надеюсь это поможет.
Спасибо, Тим.