1

Python を使用して HyperV サーバー上にコントロール VM を書き込もうとしています。HyperV サーバーが実行されているサーバーに接続することから始めます。

connection = wmi.connect_server(server="servername", namespace=r"root\virtualization", user=r"username", password=r"password")
wmiServerConnection = wmi.WMI(wmi=connection)

これによりwmi、この接続のオブジェクトが得られます。

VM の停止と開始には、次のように簡単に使用できます。

#get the wmi object representing the VM
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName="VmName")
#send change request to vm
vmSystem[0].RequestStateChange(3)

しかし、VM を開始する前に、特定のスナップショットを適用したいと考えています。クラス Msvm_VirtualSystemManagementService は、このためのメソッドを提供しApplyVirtualSystemSnapshotますApplyVirtualSystemSnapshotEx。パラメータとしてが必要で、同じクラスSnapshotSettingDataのメソッドを使用して取得できると思いました。GetSummaryInformationMSDN によると、このメソッドはMsvm_SummaryInformationクラスを返します。

この関数を次のように呼び出します。

#get the wmi class object
vmManagement = wmiServerConnection.Msvm_VirtualSystemManagementService()
snapshotInfo = vmManagement[0].GetSummaryInformation([1,107])

これにより、HyperV サーバー上のすべての VM の名前とスナップショット情報が得られます。しかし、得られるのは COM オブジェクトのリストだけです。

から取得したパラメーターとして特定の VM を指定しようとすると、

vmSettings = wmiServerConnection.Msvm_VirtualSystemSettingData(ElementName="VmName")

このような

snapshotInfo = vmManagement[0].GetSummaryInformation([1,107], [vmSettings[0]])

クラッシュします。

私の質問:

  1. WMI オブジェクトを取得できないのはなぜですか?

  2. 2 番目のパラメーターは明らかに間違っています。MSDN は、パラメータとして必要だと言ってCIM_VirtualSystemSettingData REF SettingData[]います。WMI オブジェクトが間違っていますか? 正しいパラメーターを取得するにはどうすればよいですか?

  3. COM オブジェクトから必要な情報を取得するにはどうすればよいですか?

それとも、私は完全に間違った方向に進んでいますか?

ありがとう、ステファニー

4

1 に答える 1

6

それで、私はついに解決策を見つけました。思ったよりずっと簡単でしたが、何でも:

1.サーバーに接続し、WMIオブジェクトを取得します。

connection = wmi.connect_server(server=serverName, namespace=r"root\virtualization", user=username, password=password)
wmiServerConnection = wmi.WMI(wmi=connection)

2.システムオブジェクトと管理サービスオブジェクトを取得します。

#get object representing VM
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName=VmName)
#get object responsible for VM
vmManagement = wmiServerConnection.Msvm_VirtualSystemManagementService()

3.VMに関連付けられているオブジェクトを取得します。

#get objects the VM contains
    vmObjects = vmSystem[0].associators(wmi_result_class="Msvm_VirtualSystemSettingData ")

4.必要なスナップショットを適用します。

for singleVmObject in vmObjects:    
    if(singleVmObject.SettingType == 5 and singleVmObject.ElementName == snapshotName):
        retVal = vmManagement[0].ApplyVirtualSystemSnapshotEx(vmSystem[0].path(), singleVmObject.path())

詳細なドキュメントはここにあります:

http://timgolden.me.uk/python/wmi/wmi.html

http://msdn.microsoft.com/en-us/library/cc136986(v=vs.85).aspx

于 2012-10-31T15:13:24.873 に答える