TechReport

技術者情報

ソリューション

2013年9月25日(水)公開

第132回

Hyper-Vの新機能WMI provider (V2)

Hyper-Vの新機能について紹介

GMOインターネット株式会社 システム本部 樋口 勝一が担当するGMO最新ネット業界レポート-ソリューション編。

今回はWindows Server 2012のリリースに合わせて新しくなった、Hyper-Vの新機能「root\virtualization\v2」名前空間について紹介します。

記事INDEX

Hyper-Vの新機能

Windows Server 2012のリリースと合わせて、Hyper-Vも新機能を搭載して新しくなりました。 これに伴い、これまで利用してきたWMI の「root\virtualization」という名前空間とは別に、「root\virtualization\v2」というものが追加され、機能強化や設定変更が行われています。


 > Hyper-V WMI Provider


 > Hyper-V WMI provider (V2)


新しいHyper-Vでもroot\virtualization名前空間は利用できますが、マイクロソフトとして推奨しないということになり、今後はroot\virtualization\v2を利用するようにとのことです。


 >削除された機能または推奨されなくなった機能


こういった事情もあり、今回からは新しく追加されたroot\virtualization\v2の詳細をいくつか解説してみたいと思います。


Power Shellはネットでもいくつかサンプルが出ていると思いますが、せっかくのGMO最新ネット業界レポートなので、「.Net」でいってみたいと思います。


root\virtualization名前空間とroot\virtualization\v2名前空間の比較

root\virtualization名前空間と、root\virtualization\v2名前空間を簡単に比較してみましょう。


Hyper-Vに対してVMを作成したり、変更、削除などするには、VirtualSystemManagementServiceクラス内のメソッドを利用します。root\virtualization名前空間のメソッド一覧と、root\virtualization\v2名前空間のメソッド一覧を見比べてみても、その内容がかなり変更されていることがわかると思います。


 > root\virtualization名前空間のメソッド一覧


 > root\virtualization\v2名前空間のメソッド一覧


root\virtualization\v2名前空間のメソッドは、一見しただけではどんな機能を提供するのか分からないようなものも結構ありますね。


まずは基本的なところから。以前ご紹介したのはroot\virtualization名前空間を利用したVMの作成方法です。


 > Hyper-Vを使ったクラウドサービスの作り方 Vol.3


こちらをroot\virtualization\v2を利用したバージョンにアップグレードしてみましょう。 今回はわかりやすいように、root\virtualizationとroot\virtualization\v2それぞれの名前空間での利用方法を比べながら説明していきます。


root\virtualizationでは「DefineVirtualSystem」というメソッドが、root\virtualization\v2では「DefineSystem」というメソッド名に変更されています。


 > DefineVirtualSystem


 > DefineSystem


DefineVirtualSystemメソッドとDefineSystemメソッドの違い
DefineVirtualSystemメソッド

 uint32 DefineVirtualSystem((

      [in] string SystemSettingData,

      [in] string ResourceSettingData[],

      [in] CIM_VirtualSystemSettingData REF SourceSetting,

      [out] CIM_ComputerSystem REF DefinedSystem,

      [out] CIM_ConcreteJob REF Job

);

DefineSystemメソッド

 uint32 DefineSystem(

      [in] string SystemSettings,

      [in] string ResourceSettings[],

      [in] CIM_VirtualSystemSettingData REF ReferenceConfiguration,

      [out] CIM_ComputerSystem REF ResultingSystem,

      [in, out] CIM_ConcreteJob REF Job

);

DefineSystemメソッドでVMの骨組みだけを作るのであれば、「SystemSettings」の引数に、VMの名前とVMのフォルダパスを与えるだけで、VMを作ることができます。

root\virtualization のDefineVirtualSystemメソッドでは、「System Setting Data」引数に該当しますが、この引数の型が「Msvm_VirtualSystemGlobal Setting Dataクラス」だったのに対して、「DefineSystem」メソッドの「SystemSettings」引数の型は、「Msvm_VirtualSystemSettingDataクラス」と、それぞれの引数の型も内容も大きく変わっているので注意が必要です。


 > Msvm_VirtualSystemGlobal Setting Dataクラス


 > Msvm_VirtualSystemSettingDataクラス


では実際のコードの紹介です。

root\virtualization名前空間を利用したサンプルコードは以前紹介したものと同じものとなります。比較のために今回掲載しておきます。


 > Hyper-Vを使ったクラウドサービスの作り方 Vol.3



root\virtualization名前空間 DefineVirtualSystem メソッドサンプル
 
   1:  Imports System.Management
   2:   
   3:  Module Module1
   4:      Sub Main()
   5:          Dim strUser As String = ""
   6:          Dim strPass As String = ""
   7:          Dim objManagementScope As ManagementScope = ConnectManagementScope("win2008r2.local", strUser, strPass)
   8:          Call DefineVM(objManagementScope, "VM01", "D:\Hyper-V\VM01")
   9:      End Sub
  10:   
  11:      Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
  12:          Dim objConnectionOptions As New ConnectionOptions()
  13:          objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
  14:          objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
  15:          objConnectionOptions.Username = strAccount
  16:          objConnectionOptions.Password = strPassword
  17:          Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization", objConnectionOptions)
  18:          objManagementScope.Connect()
  19:          Return (objManagementScope)
  20:      End Function
  21:   
  22:      Function DefineVM(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strFolderPath As String) As Boolean
  23:          Dim objVirtualSystemGlobalsettingData As New ManagementClass(objManagementScope, New ManagementPath("Msvm_VirtualSystemGlobalsettingData"), Nothing)
  24:          Dim objVirtualSystemGlobalsettingDataInstance As ManagementObject = objVirtualSystemGlobalsettingData.CreateInstance
  25:          objVirtualSystemGlobalsettingDataInstance("ElementName") = strVMName
  26:          objVirtualSystemGlobalsettingDataInstance("ExternalDataRoot") = strFolderPath
  27:          Dim strSystemsettingData As String = objVirtualSystemGlobalsettingDataInstance.GetText(TextFormat.CimDtd20)
  28:   
  29:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  30:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("DefineVirtualSystem")
  31:              objParams("SystemsettingData") = strSystemsettingData
  32:              objParams("ResourceSettingData") = Nothing
  33:              objParams("SourceSetting") = Nothing
  34:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("DefineVirtualSystem", objParams, Nothing)
  35:              Return JobComplete(objManagementBaseObject, objManagementScope)
  36:          Next
  37:      End Function
  38:   
  39:      Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
  40:          'JobState New = 2  Starting = 3  Running = 4  Suspended = 5  ShuttingDown = 6  Completed = 7  Terminated = 8  Killed = 9  Exception = 10  Service = 11
  41:          If objManagementBaseObject("ReturnValue") <> 0 Then
  42:              Dim strJobPath As String = objManagementBaseObject("Job")
  43:              Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
  44:              objJob.Get()
  45:              Do While objJob("JobState") = 3 Or objJob("JobState") = 4
  46:                  System.Threading.Thread.Sleep(1000)
  47:                  objJob.Get()
  48:              Loop
  49:              If objJob("JobState") <> 7 Then
  50:                  Console.WriteLine("ErrorCode=" & objJob("ErrorCode") & " JobState=" & objJob("JobState"))
  51:                  Return False
  52:              Else
  53:                  Return True
  54:              End If
  55:          Else
  56:              Return True
  57:          End If
  58:      End Function
  59:  End Module


root\virtualization\v2名前空間 DefineSystemメソッドサンプル
 
   1:  Imports System.Management
   2:   
   3:  Module Module1
   4:      Sub Main()
   5:          Dim strUser As String = ""
   6:          Dim strPass As String = ""
   7:          Dim objManagementScope As ManagementScope = ConnectManagementScope("winsvr2012.local", strUser, strPass)
   8:          Call DefineVM(objManagementScope, "VM01", "D:\Hyper-V\VM01")
   9:      End Sub
  10:   
  11:      Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
  12:          Dim objConnectionOptions As New ConnectionOptions()
  13:          objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
  14:          objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
  15:          objConnectionOptions.Username = strAccount
  16:          objConnectionOptions.Password = strPassword
  17:          Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization\v2", objConnectionOptions)
  18:          objManagementScope.Connect()
  19:          Return (objManagementScope)
  20:      End Function
  21:   
  22:      Function DefineVM(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strFolderPath As String) As Boolean
  23:          Dim objVirtualSystemSettingData As New ManagementClass(objManagementScope, New ManagementPath("Msvm_VirtualSystemSettingData"), Nothing)
  24:          Dim objVirtualSystemSettingDataInstance As ManagementObject = objVirtualSystemSettingData.CreateInstance
  25:          objVirtualSystemSettingDataInstance("ElementName") = strVMName
  26:          objVirtualSystemSettingDataInstance("ConfigurationDataRoot") = strFolderPath
  27:          Dim strSystemsettingData As String = objVirtualSystemSettingDataInstance.GetText(TextFormat.CimDtd20)
  28:   
  29:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  30:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("DefineSystem")
  31:              objParams("SystemSettings") = strSystemsettingData
  32:              objParams("ResourceSettings") = Nothing
  33:              objParams("ReferenceConfiguration") = Nothing
  34:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("DefineSystem", objParams, Nothing)
  35:              Return JobComplete(objManagementBaseObject, objManagementScope)
  36:          Next
  37:      End Function
  38:   
  39:      Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
  40:          'JobState New = 2  Starting = 3  Running = 4  Suspended = 5  ShuttingDown = 6  Completed = 7  Terminated = 8  Killed = 9  Exception = 10  Service = 11
  41:          If objManagementBaseObject("ReturnValue") <> 0 Then
  42:              Dim strJobPath As String = objManagementBaseObject("Job")
  43:              Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
  44:              objJob.Get()
  45:              Do While objJob("JobState") = 3 Or objJob("JobState") = 4
  46:                  System.Threading.Thread.Sleep(1000)
  47:                  objJob.Get()
  48:              Loop
  49:              If objJob("JobState") <> 7 Then
  50:                  Console.WriteLine("ErrorCode=" & objJob("ErrorCode") & " JobState=" & objJob("JobState"))
  51:                  Return False
  52:              Else
  53:                  Return True
  54:              End If
  55:          Else
  56:              Return True
  57:          End If
  58:      End Function
  59:  End Module


コードの構成自体はほぼ似たようなものとなっています。具体的なコードの解説はこちらを参考にしてもらい、変更された箇所のポイントに絞って解説します。

17行目:
      肝心の名前空間です。root\virtualization\v2 を指定します。


23行目:
      31行目に指定する引数「SystemSettings」の型が「Msvm_VirtualSystemSettingDataクラス」に変更されているので注意を。


25-26行目:
      VM作成のために最低限の情報、VM名と保存先フォルダを指定します。


30-34行目:
      メソッド名が「DefineSystem」となり、引数名もそれぞれ変更されています。


35行目:
    JobCompleteに関してはこれまでと同じものが利用できます。

以上、簡単ですがポイントとなる部分だけ解説させていただきました。

コード自体の構文はあまり変わらないものの、メソッドの名前や、同じようなメソッドでも引数となるオブジェクト自体が変更されているなど、様々です。今後もできるだけサンプルを交えて解説してゆきたいと思います。





*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。

樋口 勝一

GMOインターネット株式会社

1999年6月GMOインターネットに入社。Windowsを用いたホスティング事業の立ち上げの際、サービス開発からその後の保守・運用まで1人で担当。2010年には「お名前.comWindowsデスクトップ」をリリースし、マイクロソフト社と強い信頼関係を構築。2007年から連続で「マイクロソフトMVPアワード」を受賞し、Windowsのスペシャリストとして活躍。

執筆者一覧

 執筆協力した本が出版されました

 当レポートを担当しているGMOインターネット株式会社 事業本部 樋口 勝一が執筆協力をした書籍が出版されました。

Dynamic Memory
  最新!Android徹底活用読本

出版社:宝島社
価格:880円(税込) ※価格は店舗によって異なります。

次々に発売されるAndroidケータイを「コミュニケーションしたい」「情報をブラウジングしたい」「ビジネス手帳の代わりにしたい」「音楽や動画を120%楽しみたい」など、やりたいこと別に章立てした活用書。

Dynamic Memory
  GALAXY Sユーザーのためのアプリ245

出版社:三才ブックス
価格:1,260円(税込) ※価格は店舗によって異なります。

25万本以上あるといわれるAndroidアプリの中から、目的別・状況別に本当に使えるアプリだけを厳選。

Dynamic Memory
  ソニー・エリクソン公式 Xperia arc ガイドブック

出版社:日経BP社
価格:1,260円(税込) ※価格は店舗によって異なります。

こだわりのデザインと薄さを追求しながら、Androidスマートフォンのフラッグシップモデルとして世界に先駆けて日本で発売されるXperia arcの公式ガイドブックです。