WIN1@Codename

Codename

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Hyper-V をプログラムでどうにかしてみる その13 (isoイメージのアンマウント)

TechNetの方であがっていた質問だったのですが、PowerShellでは簡単に実現できたisoイメージのアンマウントでしたが、VBでやろうとするとエラーが出てしまいなかなかうまくいきませんでした。

MSのサポートへも問い合わせしてみたのですが、明確なサンプルは存在しないとのことで、RunspaceInvoke を利用してVBからPowerShellのコマンドを呼び出す方法で回避せよとのことでした。

うーん・・・、PowerShellでできるということは、WMIの問題ではないだろうとの予測。
やはり、VBでの書き方か、ということでトライ&エラーを繰り返してようやく出来ました!
これが一週間悩んだ成果です。

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 objComputerSystem As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
    objComputerSystem = objManagementObject
Next

Dim objDVD As ManagementObject
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType = 16 AND Address = '0'")).Get
    objDVD = objManagementObject
    Exit For
Next

Dim objISO As ManagementObject
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourceAllocationSettingData")).Get
    objISO = objManagementObject
    If objISO("Parent") = objDVD.Path.Path Then
        Console.WriteLine(objISO("Connection")(0))
        Exit For
    End If
Next

For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
    Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("RemoveVirtualSystemResources")
    Dim strResourceSettingData As String() = New String(0) {}
    strResourceSettingData(0) = objISO.Path.Path
    objParams("ResourceSettingData") = strResourceSettingData
    objParams("TargetSystem") = objComputerSystem.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("RemoveVirtualSystemResources", objParams, Nothing)
Next 

ポイントは ResourceSettingData へ渡すデータでした。
ModifyVirtualSystemResources や AddVirtualSystemResources では対象オブジェクトをCimDtd20形式の文字列で渡していましたが、RemoveVirtualSystemResources ではオブジェクトの Path.Path プロパティーを渡すこととなっていました。

よくよく考えればなーるほどなんですけどねぇ・・・。

コメント

コメントの投稿


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

トラックバック

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

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。