Назад | Перейти на главную страницу

Как получить 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; 
        }    
    }
}

Вы можете использовать для этого 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

Надеюсь это поможет.

Спасибо, Тим.