Я создал сценарий автоматической сборки для создания новых виртуальных машин на 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;
}
}
}
Вы можете использовать для этого WMI. Возможно, в 2008R2 нет той области, которую вы ищете.
get-vm -Name $VMName | Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_ | select-object IPAddress
Вам также может потребоваться выполнить некоторую фильтрацию на сетевой карте, которую вы выбираете, если у вас есть несколько. Вам также может потребоваться проверить, что выводит get-vm, поскольку я не уверен, что он будет напрямую перенаправлен в get-wmiobject. Возможно, вам потребуется передать его по конвейеру в foreach-object и таким образом получить имя компьютера.
****РЕДАКТИРОВАТЬ****
get-vm -Name $VMName | foreach-object { Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_.name } | select-object IPAddress
Надеюсь это поможет.
Спасибо, Тим.