【问题标题】:Python WMI Hyper-v GetSummaryInformation resultPython WMI Hyper-v GetSummaryInformation 结果
【发布时间】:2015-12-23 16:03:25
【问题描述】:

我正在尝试从 Hyper-V 服务器上的所有可用虚拟机中检索信息。问题是当我询问摘要信息时,我得到一个无用 COMObjects 的列表。

我找不到获取实际 SummaryInformation 值的方法..

代码如下:

import wmi

conn = wmi.connect_server(server="xxxx", user="xxxx", password="xxx", namespace=r"root\virtualization\v2")
client = wmi.WMI(wmi=conn)
mgs = client.Msvm_VirtualSystemManagementService()
summaries = mgs[0].GetSummaryInformation()

print summaries
# (0, [<COMObject <unknown>>, <COMObject <unknown>>, <COMObject <unknown>>])

所以我尝试检索一个 VirtualSystemData 作为参数传递给 getSummary

vs = h.Msvm_VirtualSystemSettingData()
vs[0]
#Out[34]: <_wmi_object: \\WIN-Lxxxxxx\root\virtualization#\v2:Msvm_VirtualSystemSettingData.InstanceID="Microsoft:xxx-xxx-xxx-xxx">

mgs[0].GetSummaryInformation([vs[0].ole_object])
#Out[38]: (0, [<COMObject <unknown>>, <COMObject <unknown>>, <COMObject <unknown>>])

有什么想法吗?

【问题讨论】:

    标签: python wmi hyper-v


    【解决方案1】:

    解决方案:

    首先,请注意选择用于检索虚拟设置数据的对象。为了避免在 de vms 之间有管理器,最好这样开始:

    vms = client.query("select * from Msvm_ComputerSystem where Caption=\"Virtual Machine\"")
    

    从那里我们可以迭代每个虚拟机,询问其设置,然后使用管理器检索摘要信息:

    # SummaryInformation attributes
    vm_attrs = {
        'Name': 0, 
        'ElementName': 1, 
        'CreationTime': 2, 
        'Notes': 3, 
        'NumberOfProcessors': 4, 
        'ThumbnailImage': 5, 
        'ThumbnailImage': 6, 
        'ThumbnailImage': 7, 
        'AllocatedGPU': 8, 
        'EnabledState': 100, 
        'ProcessorLoad': 101, 
        'ProcessorLoadHistory': 102, 
        'MemoryUsage': 103,
        'Heartbeat': 104, 
        'UpTime': 105, 
        'GuestOperatingSystem': 106, 
        'Snapshots': 107, 
        'AsynchronousTasks': 108, 
        'HealthState': 109, 
        'OperationalStatus': 110, 
        'StatusDescriptions': 111, 
        'MemoryAvailable': 112, 
        'AvailableMemoryBuffer': 113 
    }
    
    vms = client.query("select * from Msvm_ComputerSystem where Caption=\"Virtual Machine\"")
    management_service = client.Msvm_VirtualSystemManagementService()[0]
    
    for vm in vms:
        settings = vm.associators(wmi_result_class='Msvm_VirtualSystemSettingData')
    
        vm_original = filter(lambda x: 'Realized' in x.VirtualSystemType, settings)
        vm_snapshots = filter(lambda x: 'Snapshot' in x.VirtualSystemType, settings)
    
        # skipped retrieving snapshots to make it shorter, but is exactly the same        
        vm_data = {'snapshots': len(vm_snapshots)}
        paths = [vm_original[0].path_()]
        summary_info = management_service.GetSummaryInformation(vm_attrs.values(), paths)
        if summary_info[0] != 0:
            raise Exception("Error retrieving information from vm '%s'" % vm.Name)
    
        # Note, if you do dir() on the COMObject from the summary info list, you wont find any attribute from the docs, but, trust me, if you do summary[1][0].NumberOfProcessors or any other attribute, it will work. 
        vm_data.update({attr: getattr(summary_info[1][0], attr) for attr in vm_attrs.keys()})
    
        vms_data[vm.Name] = vm_data
    

    我花了很长时间才弄清楚...希望这最终会对其他人有所帮助。 :)

    【讨论】:

    • 我不知道为什么我对 wmi 如此深入,但这确实救了我的命。顺便说一句,我需要将vm_attrs.values() 更改为list(vm_attrs.values())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多