python 如何从 WMI 获取 64 位值

How to get 64-bit value from WMI in python

当我运行以下代码时:

def get_process_info(pid):
    c = wmi.WMI(namespace='root\cimv2')
    obj = c.Win32_Process(ProcessId = pid)[0]
    print "VirtualSize:", obj.wmi_property('VirtualSize').type
    print "VirtualSize:", obj.wmi_property('VirtualSize').Value

def get_perf_info(pid):
    c = wmi.WMI(namespace='root\cimv2')
    obj = c.Win32_PerfFormattedData_PerfProc_Process(IDProcess = pid)[0]
    print "PrivateBytes:", obj.wmi_property('PrivateBytes').type
    print "PrivateBytes:", obj.wmi_property('PrivateBytes').Value

针对一个使用大量内存的进程,我得到这个:

VirtualSize: uint64
VirtualSize: 5015498752
PrivateBytes: uint64
PrivateBytes: 4294967295

请注意,两者都被列为 64 位值,但 PrivateBytes 值是 0xFFFFFFFF。如果我使用 "WMI Explorer",我可以看到 PrivateBytes 值大于 32 位:

我的问题是如何访问完整的 64 位 PrivateBytes?

除了这个 WMI 模块之外,还有其他完全不同的方法可以从 python 读取 WMI 吗?

您可以使用 wmic,它为 WMI 提供命令行界面:

def find_privatebytes(pid):
    with os.popen('wmic process list full /format:csv') as csvfile:
        reader = csv.reader(csvfile, delimiter=',', quotechar='"')
        crow = 0
        col_pid = 0
        col_pb  = 0

        for row in reader:
            if len(row) == 0:
                continue
            if crow == 0:                
                col_pid = row.index("ProcessId")
                col_pb  = row.index("PrivatePageCount")
                crow += 1
            elif int(row[col_pid]) == pid:
                return int(row[col_pb])
        return 0