Get-VM の IntegrationServicesVersion と IntegrationServicesState の値を見ればわかるはずなんですが、Windows Server 2016(評価版)の Hyper-V と Windows 10 の Hyper-V のどちらも、 IntegrationServicesVersion は 0.0(Major, Minor, Build, Revision = 0, 0, -1, -1)、IntegrationServicesState は空っぽの値を返すことに気が付きました。バグ?
じゃぁどうすればよいかというと、KVP (キー値データ交換)サービスから取得すればよろし。ちゃちゃっとスクリプト作ってみたので、どうぞ。
↓ この Windows 8.1 ゲストの統合サービスは古いのが分かる。
[getisver.vbs]
Cscript getisver.vbs "仮想マシン名" ・・・ 仮想マシンの統合サービスの情報を表示します。Cscript getisver.vbs ・・・ Hyper-V ホスト上の仮想マシンの統合サービスの情報を表示します。
Option Explicit
Dim arg, targetVM, WMIService, VMs, VM, InputKey
Dim KVP, xml, guestData, xpath, node
Dim KVPData, KVPValue, GuestIS, GuestOSName, GuestOSVer, GuestStatus
If Right((LCase(WScript.FullName)),11) <> "cscript.exe" then
WScript.Echo "Use cscript getisver.vbs [VM Name]"
WScript.Quit
End if
WScript.Echo "VM Name, Status, OS Name, OS Version, IntegrationServicesVersion"
WScript.Echo "----------------------------------------------------------------"
Set arg = WScript.Arguments
if arg.Count = 0 then
Set WMIService = GetObject("winmgmts:\\.\root\virtualization\v2")
Set VMs = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem")
For Each VM In VMs
if (VM.Caption = "Virtual Machine") or (VM.Caption = "仮想マシン") then
targetVM = VM.ElementName
GetGuestISVer(targetVM)
end if
Next
else
targetVM = arg(0)
GetGuestISVer(targetVM)
end if
Function GetGuestISVer(targetVM)
Set WMIService = GetObject("winmgmts:\\.\root\virtualization\v2")
Set VMs = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & targetVM & "'")
if VMs.Count < 1 then
WScript.Echo targetVM & " が見つかりません。"
WScript.Quit
end if
GuestStatus = ""
GuestIS = "---"
GuestOSName = "---"
GuestOSVer = "---"
KVPData = ""
KVPValue = ""
Select Case VMs.ItemIndex(0).EnabledState
Case 2 '実行中
GuestStatus = "Running"
Set KVP = (VMs.ItemIndex(0).Associators_("Msvm_SystemDevice", "Msvm_KvpExchangeComponent")).ItemIndex(0)
Set xml = CreateObject("Microsoft.XMLDOM")
xml.async = false
for each guestData in KVP.GuestIntrinsicExchangeItems
xml.loadXML(guestData)
xpath = "/INSTANCE/PROPERTY[@NAME='Name']/VALUE/child:text()"
set node = xml.selectSingleNode(xpath)
KVPData = node.text
xpath = "/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child:text()"
set node = xml.selectSingleNode(xpath)
if node is nothing then
KVPValue = ""
else
KVPValue = node.text
end if
Select Case KVPData
Case "IntegrationServicesVersion"
GuestIS = KVPValue
Case "OSName"
GuestOSName = KVPValue
Case "OSVersion"
GuestOSVer = KVPValue
End Select
Set node = nothing
next
Case Else
GuestStatus = "Off"
End Select
WScript.Echo targetVM & ", " & GuestStatus & ", " & GuestOSName & ", " & GuestOSVer & ", " & GuestIS
End Function
Dim arg, targetVM, WMIService, VMs, VM, InputKey
Dim KVP, xml, guestData, xpath, node
Dim KVPData, KVPValue, GuestIS, GuestOSName, GuestOSVer, GuestStatus
If Right((LCase(WScript.FullName)),11) <> "cscript.exe" then
WScript.Echo "Use cscript getisver.vbs [VM Name]"
WScript.Quit
End if
WScript.Echo "VM Name, Status, OS Name, OS Version, IntegrationServicesVersion"
WScript.Echo "----------------------------------------------------------------"
Set arg = WScript.Arguments
if arg.Count = 0 then
Set WMIService = GetObject("winmgmts:\\.\root\virtualization\v2")
Set VMs = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem")
For Each VM In VMs
if (VM.Caption = "Virtual Machine") or (VM.Caption = "仮想マシン") then
targetVM = VM.ElementName
GetGuestISVer(targetVM)
end if
Next
else
targetVM = arg(0)
GetGuestISVer(targetVM)
end if
Function GetGuestISVer(targetVM)
Set WMIService = GetObject("winmgmts:\\.\root\virtualization\v2")
Set VMs = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & targetVM & "'")
if VMs.Count < 1 then
WScript.Echo targetVM & " が見つかりません。"
WScript.Quit
end if
GuestStatus = ""
GuestIS = "---"
GuestOSName = "---"
GuestOSVer = "---"
KVPData = ""
KVPValue = ""
Select Case VMs.ItemIndex(0).EnabledState
Case 2 '実行中
GuestStatus = "Running"
Set KVP = (VMs.ItemIndex(0).Associators_("Msvm_SystemDevice", "Msvm_KvpExchangeComponent")).ItemIndex(0)
Set xml = CreateObject("Microsoft.XMLDOM")
xml.async = false
for each guestData in KVP.GuestIntrinsicExchangeItems
xml.loadXML(guestData)
xpath = "/INSTANCE/PROPERTY[@NAME='Name']/VALUE/child:text()"
set node = xml.selectSingleNode(xpath)
KVPData = node.text
xpath = "/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child:text()"
set node = xml.selectSingleNode(xpath)
if node is nothing then
KVPValue = ""
else
KVPValue = node.text
end if
Select Case KVPData
Case "IntegrationServicesVersion"
GuestIS = KVPValue
Case "OSName"
GuestOSName = KVPValue
Case "OSVersion"
GuestOSVer = KVPValue
End Select
Set node = nothing
next
Case Else
GuestStatus = "Off"
End Select
WScript.Echo targetVM & ", " & GuestStatus & ", " & GuestOSName & ", " & GuestOSVer & ", " & GuestIS
End Function
以下の記事で書いたスクリプトをそのまま流用しているため、綺麗なコードでないのはあしからず。
Hyper-V Scripting: “実行中”の仮想マシン=ゲスト OS が“実行中”ではない (2010/07/01)
ところで...
Windows Server 2012 R2 Hyper-V の Hyper-V マネージャーにはあった「統合サービス」の項目、Windows ゲストに関しては「更新が必要」とか教えてくれてうれしいんですけど(Get-VM の IntegrationServicesState でも取得できる)...
Windows Server 2016 と Windows 10 の Hyper-V には「統合サービス」の項目が見当たらない。
IntegrationServicesVersion が0.0、IntegrationServicesState が空っぽだってこと知ってるなこれ。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。