使用Python控制Hyper-V VM

时间:2012-10-19 08:33:20

标签: python wmi hyper-v

我试图使用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作为参数,我想我可以使用同一类的GetSummaryInformation方法获取该参数。 MSDN说这个方法返回一个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. 第二个参数显然是错误的。 MSDN说它需要CIM_VirtualSystemSettingData REF SettingData[]作为参数。 WMI对象是错误的吗?如何获得正确的参数?

  3. 如何从COM对象中检索我需要的信息?

  4. 还是我完全走错了路?

    谢谢,斯蒂芬妮

1 个答案:

答案 0 :(得分: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.获取与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