これが環境です。
ホスト:Windows 10
ゲスト:Server2012およびServer2016
目的:開発中のテストのためにビルドをサーバーにプッシュすることを自動化する開発システム。
この完全なビルドスクリプトの一部として、使用するVMのリモートPSSessionを取得するPowershell関数があります。 VMはベースシステムから動的に複製されるため、現時点ではVMのOSが何であるかわかりません。
2016年のVMの場合は、PowershellDirectを使用して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コマンドレットには、VM内のOSを特定する方法が必要です。そうでないかもしれない。私はこれを解決する他の方法にもオープンです。ありがとう!
残念ながらGet-VM
コマンドレットは、ゲストVMが実行されているOSの詳細を提供しません。ゲストOSがWindowsServer2016またはWindowsServer 2012のどちらであるかを調べようとしているので、使える Get-WMIObject
その正確な情報を取得します。
次のコマンドを使用すると、バージョン番号が返されます。
Get-WMIObject -Class Win32_OperatingSystem -ComputerName $VMName -Credential $VMCredentials | Select-Object *Version -ExpandProperty Version*
Windows2012はバージョン6.3.x
Windows2016のバージョンは10.0.x
。