WIN1@Codename

Codename

Hyper-V をプログラムでどうにかしてみる その3 (仮想マシンの起動/シャットダウン)

今回は仮想マシンの起動とシャットダウンです。
VBScriptのサンプルは結構ネットで探すことができるのですが、.NETのコードとなるとなかなかありませんので、参考になればと思います。

まずは起動から。

 

Imports System.Management

Dim objConnectionOptions As New ConnectionOptions()
objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate
objConnectionOptions.EnablePrivileges = True
objConnectionOptions.Username = strAccount
objConnectionOptions.Password = strPassword
Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization", objConnectionOptions)
objManagementScope.Connect()

Dim objObjectQuery As New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE Caption LIKE '仮想マシン'")
Dim objManagementObjectSearcher As New ManagementObjectSearcher(objManagementScope, objObjectQuery)
Dim objManagementObjectCollection As ManagementObjectCollection = objManagementObjectSearcher.Get
For Each objManagementObject As ManagementObject In objManagementObjectCollection
    If objManagementObject("ElementName") = strVMName Then
        Dim objParams As ManagementBaseObject = objManagementObject.GetMethodParameters("RequestStateChange")
        objParams("RequestedState") = 2
        Dim objManagementBaseObject As ManagementBaseObject = objManagementObject.InvokeMethod("RequestStateChange", objParams, Nothing)
        Console.WriteLine(objManagementBaseObject("ReturnValue"))
    End If
Next


ポイントは objParams("RequestedState") = 2 の部分です。
この2の値は前回のステータス取得の EnabledState の値と同じです。
こちらをたとえば 3 にすると仮想マシンをオフ(停止)にすることができます。

次にシャットダウンです。
こちらはステータス一覧にはないので、Msvm_ShutdownComponent クラスを利用します。

 

Imports System.Management

Dim objConnectionOptions As New ConnectionOptions()
objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate
objConnectionOptions.EnablePrivileges = True
objConnectionOptions.Username = strAccount
objConnectionOptions.Password = strPassword
Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization", objConnectionOptions)
objManagementScope.Connect()

Dim objObjectQuery As New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE Caption LIKE '仮想マシン'")
Dim objManagementObjectSearcher As New ManagementObjectSearcher(objManagementScope, objObjectQuery)
Dim objManagementObjectCollection As ManagementObjectCollection = objManagementObjectSearcher.Get
For Each objComputerSystem As ManagementObject In objManagementObjectCollection
    If objComputerSystem("ElementName") = strVMName Then
        For Each objShutdownComponent As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ShutdownComponent WHERE SystemName='" & objComputerSystem("Name") & "'")).Get
Dim objParams As ManagementBaseObject = objShutdownComponent.GetMethodParameters("InitiateShutdown")
objParams("Force") = True
objParams("Reason") = ""
Dim objManagementBaseObject As ManagementBaseObject = objShutdownComponent.InvokeMethod("InitiateShutdown", objParams, Nothing)
Console.WriteLine(objManagementBaseObject("ReturnValue"))
        Next
    End If
Next

 

こちらも細かい解説は省きますが、こんな感じでシャットダウンできるのだと分かればよいかなと思います。


コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://codename2010.blog11.fc2.com/tb.php/41-c167ef03
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad