使用Python查询WMI和Win32.Client对象

2 投票
4 回答
6058 浏览
提问于 2025-04-15 11:03

有人能帮我解释一下如何通过 WMI 和 win32.client 对象进行查询吗?

每次我尝试通过 win32.client 对象进行查询时,都会出现这个错误:

错误:'' 对象没有 'UserName' 属性

不过,我知道(比如使用 wmic 类 "Win32_ComputerSystem",wmiexplorer 等)这个特定的属性是属于我想查询的对象的:

import win32com.client
...
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root/cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_ComputerSystem")
for objItem in colItems:{
    print objItem.UserName    #Error: '' object has no attribute 'UserName'
}
...

而当我在 WMI 对象上运行查询时,一切都正常:

import wmi
...
c = wmi.WMI()
for objItem in c.query(colItems):{
    print objItem.UserName  # this works now
}
...

是什么导致了这个“没有属性”的错误?这可能是我的操作系统的问题吗?我在使用的是 Windows XP 专业版,版本 2002,服务包 2。还是说这是因为我使用的 Python 2.4 版本的问题?

4 个回答

0

好的,大家,这里有一段代码(来自 http://win32com.goermezer.de/content/view/211/189/):

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_Environment")
for objItem in colItems:{
    print "Caption: ", objItem.Caption
    print "Description: ", objItem.Description
    print "Install Date: ", objItem.InstallDate
    print "Name: ", objItem.Name
    print "Status: ", objItem.Status
    print "System Variable: ", objItem.SystemVariable
    print "User Name: ", objItem.UserName
    print "Variable Value: ", objItem.VariableValue
}

然后又出现了同样的错误:

Caption: Error: '' object has no attribute 'Caption' 

到底发生了什么?为什么在ExecQuery中指定的类和实际的类不一样?我的意思是,如果有人说“从Win32_ComputerSystem中选择所有”,那怎么会查询到不同于Win32_ComputerSystem的类呢?

顺便说一下,我是在spyce 2.0.3服务器上运行python 2.4的代码。

补充一下,我发现使用大括号{}是让python代码块正确解释的一种方法——否则会抛出“期望一个缩进块”的错误。

1

试着用这种方式访问 colItems 的属性:

for objItem in colItems[o].Properties_:
    print objItem.Name, objItem.Value

在其他情况下,你可能更喜欢使用

repr(objItem.Value) 

还有

repr(objItem.Value) 
3

要了解WMI查询结果中的“键”和“值”,你可以使用“Properties_”这个东西。

from win32com.client import Dispatch, GetObject import win32con
server = Dispatch("WbemScripting.SWbemLocator")
c = server.ConnectServer("localhost", "root\\cimv2") 
p = c.ExecQuery("Select * from Win32_OperatingSystem")

for i in w.p[0].Properties_:
    print i.Name, " = ", i.Value

撰写回答