如何使用 PowerShell 获取 Hyper-V 上 Windows 2008 R2 VM 的 IP 地址?

如何使用 PowerShell 获取 Hyper-V 上 Windows 2008 R2 VM 的 IP 地址?

我已经创建了一个自动构建脚本,以在 Hyper-V 2016 上构建新的虚拟机。我有时需要 2008 R2 虚拟机,而获取 IP 地址以连接到我的 2012 R2/2016 虚拟机的方式是使用一些 powershell,例如:

get-vm -Name $VMName|Get-VMNetworkAdapter|Select-Object -ExpandProperty IpAddresses

适用于 2012/2016,但使用 2008 R2 VM 时返回空数组。关于如何使用 Powershell 从 Hyper-V 获取 IP 地址,您有什么想法吗?该脚本正在 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-object 并以此方式检索计算机名称。

****编辑****

get-vm -Name $VMName | foreach-object { Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_.name } | select-object IPAddress

希望这可以帮助。

谢谢,蒂姆。

相关内容