запросы через объекты wmi & win32.client с помощью python - PullRequest
2 голосов
/ 26 марта 2009

Может ли кто-нибудь пролить свет на запросы через объекты wmi и win32.client?

Каждый раз, когда я пытаюсь запросить объект win32.client, я получаю эту ошибку:

Ошибка: у объекта нет атрибута «Имя пользователя»

хотя, я знаю (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
}
...

Что вызывает эту ошибку «без атрибута»? Может ли это быть моей проблемой ОС? Запуск winXP pro, версия 2002, sp2. Или это из-за версии Python 2.4, над которой я работаю?

Ответы [ 4 ]

2 голосов
/ 17 октября 2010

Чтобы узнать о «ключах» и «значениях» в результате запроса WMI, вы можете использовать «Свойства _»

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
1 голос
/ 01 марта 2011

попробуйте получить доступ к свойствам colItems следующим образом:

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

в других случаях вы можете использовать

repr(objItem.Value) 

и

repr(objItem.Value) 
0 голосов
/ 30 марта 2009

Хорошо, ребята, вот еще один фрагмент кода (из 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?

Кстати, я запускаю код Python 2.4 через сервер Spyce 2.0.3.

p.s. Я обнаружил, что квадратные скобки {} - это один из способов правильно интерпретировать блок кода Python - в противном случае выдается ошибка «ожидается блок с отступом»

0 голосов
/ 26 марта 2009

Зачем ты это делаешь?

for objItem in colItems:{
    print objItem.UserName    #Error: '' object has no attribute 'UserName'
}

Что заставляет вас думать, что результирующие столбцы будут атрибутами результирующего объекта?

Попробуйте отладить проблему.

for objItem in colItems:{
    print dir(objItem)
}

Какие реальные атрибуты у него есть? Возможно, столбцы обозначены номером? Возможно, вы должны делать objItem[0]?


Редактировать

что вызвало изменение атрибутов в классе "Win32_ComputerSystem" ??

Ничего. Атрибуты не меняются. Класс - это не то, что вы думаете.

Вот еще одно средство отладки.

colItems = objSWbemServices.ExecQuery("Select * from Win32_ComputerSystem")
print type(colItems)
print dir(colItems)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...