2012-10-19 138 views
1

即時嘗試使用Python在HyperV服務器上編寫控制虛擬機。我開始與連接到服務器的Hyper-V的服務器上運行:使用Python控制Hyper-V虛擬機

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

這給了我這個連接的wmi對象。

停止和啓動虛擬機,我可以簡單地使用:

#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作爲參數,我想我可以使用相同類的GetSummaryInformation方法得到那個。 MSDN說這種方法返回一個Msvm_SummaryInformation類。

我調用這個函數是這樣的:

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

這應該給我起的名字和所有虛擬機的Hyper-V的服務器上的快照信息。但我得到的是COM對象列表。

當我嘗試給予一定的VM作爲參數從

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

得到這樣

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

崩潰。

我的問題:

  1. 爲什麼我沒有得到一個WMI對象?

  2. 第二個參數顯然是錯誤的。 MSDN表示它需要CIM_VirtualSystemSettingData REF SettingData[]作爲參數。 WMI對象是錯誤的嗎?我如何得到正確的參數?

  3. 如何從COM對象中檢索我需要的信息?

還是我完全在錯誤的軌道上?

謝謝,Stefanie

回答

5

所以,我終於找到了解決方案。這是比我想象的要容易得多,但無論:

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.Get與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