2016/09/29

Windows Server 2016/Windows 10 Hyper-V でゲストの統合サービスのバージョンを取得する

Windows Server 2016 および Windows 10 の Hyper-V で、レガシな Windows ゲスト用統合サービスは、vmguest.iso ではなくて、Windows Update のオプションの更新プログラム(現時点の最新は KB3063109 https://support.microsoft.com/kb/3063109 の 6.3.9600.18080 だと思う)で提供されるように変更されたのですが、ちゃんと最新になっているのか気になるところ。

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

以下の記事で書いたスクリプトをそのまま流用しているため、綺麗なコードでないのはあしからず。

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 件のコメント: