使用Python查询WMI和Win32.Client对象
有人能帮我解释一下如何通过 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