环境如下。
主机:Windows 10
客户机:Server 2012 和 Server 2016
目的:开发系统,用于在开发过程中自动将构建推送到服务器进行测试。
作为此完整构建脚本的一部分,我有一个 Powershell 函数,它为将要使用的 VM 获取远程 PSSession。由于 VM 是从基础系统动态克隆的,因此目前我不知道 VM 中的操作系统是什么。
如果是 2016 VM,我宁愿使用 Powershell Direct 连接到 VM。
$session = New-PSSession -VMName $VMName -Credential $VMCredentials
如果是 2012,我必须回退到网络上的 WinRM 会话。我有获取 IP 并建立连接的代码。它运行良好。
$vm = Get-Vm -Name $VMName
$ips = New-Object System.Collections.Generic.List[System.String]
foreach ($adapter in $vm.NetworkAdapters)
{
foreach ($ip in $adapter.IPAddresses)
{
if($ip -like '*.*')
{
$ips.Add($ip)
}
}
}
$session = New-PSSession -ComputerName $ips[0] -Authentication Negotiate -Credential $VMCredentials
我需要知道如何判断我是否应该运行 Powershell Direct(仅限 2016 年)或基于 WinRM 网络的连接(2012 年及更早版本)。
我的想法是 Hyper-V cmdlet 必须有某种方法来告知虚拟机中的操作系统。也许没有。我也愿意接受其他解决方法。谢谢!
答案1
不幸的是,Get-VM
cmdlet 不会为您提供有关客户虚拟机正在运行的操作系统的任何详细信息。由于您试图找出客户操作系统是 Windows Server 2016 还是 Windows Server 2012,因此您可以使用它Get-WMIObject
来检索该确切信息。
使用以下命令可以返回版本号:
Get-WMIObject -Class Win32_OperatingSystem -ComputerName $VMName -Credential $VMCredentials | Select-Object *Version -ExpandProperty Version*
Windows 2012 是版本,6.3.x
而 Windows 2016 是版本10.0.x
。