【问题标题】:Control Hyper-V VMs with Python使用 Python 控制 Hyper-V 虚拟机
【发布时间】:2012-10-19 08:33:19
【问题描述】:

我正在尝试使用 Python 在 HyperV 服务器上编写控制虚拟机。我首先连接到运行 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)

但在启动 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 对象列表。

当我尝试将某个虚拟机作为从

获取的参数时
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 对象中检索我需要的信息?

还是我完全走错了路?

谢谢,斯蒂芬妮

【问题讨论】:

    标签: python wmi hyper-v


    【解决方案1】:

    所以,我终于找到了解决方案。这比我想象的要容易得多,但无论如何:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多