我试图用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
对象。
对于停止和启动虚拟机,我可以简单地使用:
#get the wmi object representing the VM
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName="VmName")
#send change request to vm
vmSystem[0].RequestStateChange(3)
但在启动虚拟机之前,我想应用某个快照。
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]])
它崩溃了。
我的问题:
为什么不获取一个WMI对象?
第二个参数显然是错误的。MSDN说它需要CIM_VirtualSystemSettingData REF SettingData[]
作为参数。WMI对象是错误的吗?如何获得正确的参数?
如何从COM对象检索所需的信息?
还是我完全走错了方向?
谢谢,斯蒂芬妮
所以,我终于找到了解决办法。这比我想象的要容易得多,但无论如何:
1.连接到服务器并获取WMI对象:
2.获取系统对象和管理服务对象:
3.获取与虚拟机关联的对象:
4.应用所需的快照:
更多文档可在此处找到:
http://timgolden.me.uk/python/wmi/wmi.html
http://msdn.microsoft.com/en-us/library/cc136986(v=vs.85).aspx
相关问题 更多 >
编程相关推荐