2013-08-09 5 views
0

Я попытался получить некоторую информацию о владельце процесса, используя WMI. Я попытался запустить этот скрипт:Как получить владельца процесса с помощью Python с помощью WMI?

import win32com.client 

process_wmi = set() 
strComputer = "." 
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") 
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2") 


process_list = objSWbemServices.ExecQuery("Select * from Win32_Process") 
for process in process: 
    owner = process.GetOwner 
    if owner != 0: 
     print('Access denied') 
    else: 
     print('process: ',process.Name, 'PID: ', process.ProcessId, 'Owner: ', owner) 

Конечно, я получаю owner = 0 (Successful Completion)

Когда я попытался позвонить process.GetOwner(), я получаю эту ошибку: TypeError: 'int' object is not callable

Как использовать этот метод без ошибок? С какими параметрами или с какими флагами может быть?

Я стараюсь актуализировать и использовать этот метод, here, но я не могу преобразовать код в свою ситуацию и получить владельца процесса. = (

Или может быть кто-то знает другой способ, как получить информацию о владельце процесса. Может быть с методами WinAPI?

Спасибо за помощь!

ответ

1

Я предложил бы использовать psutil библиотеку. Я использовал WinAPI, и WMI, но это ужасно медленно :(psutil гораздо, гораздо быстрее и дает вам удобный API для работы с процессами

Вы можете достичь того же, как это:.

import psutil 
for process in psutil.get_process_list(): 
    try: 
     print('Process: %s, PID: %s, Owner: %s' % (process.name, process.pid, 
                process.username)) 
    except psutil.AccessDenied: 
     print('Access denied!') 

И потому, что только имя пользователя может дать вам отказано в доступе вы можете в except сделать:

except psutil.AccessDenied: 
    print('Process: %s, PID: %s, Owner: DENIED' % (process.name, process.pid) 

Если вы можете использовать только pywin32 и WMI, то это будет работать:

import wmi 
for i in wmi.WMI().Win32_Process(): 
    print('%s, %s, %s' % (i.Name, i.ProcessId, i.GetOwner()[2])) 
+0

Спасибо, но я могу использовать только WinApi или WMI в моем проекте. – user2319786

+0

Обновлено сообщение, добавлено решение wmi. –

+0

Спасибо, что работает отлично! – user2319786

1

Ошибка типа потому что process_list из вашего кода является «неизвестным» COM-объектом. Попробуйте это:

import win32com 
from win32com.client import GetObject 
wmi = win32com.client.GetObject("winmgmts:") 
wmi = win32com.client.gencache.EnsureDispatch(wmi._oleobj_) 
#Now execute your query 
process = wmi.ExecQuery('select * from Win32_Process') 
proc = process[0] 
#Now I can do things like check properties 
print proc.Properties_('ProcessId').Value 
#Or use methods 
parms = proc.ExecMethod_('GetOwner') 
#Now I can do things with parms like 
username = parms.Properties_('User').Value 

Parms будет ком объект типа SWbemObject так же, как и процесс прок есть. Он имеет и другие свойства: возвращаемое значение и домен. Я могу опросить его так же, как я сделал выше, чтобы получить пользователя из парм. Надеюсь это поможет.

К сожалению, добавив после факта: свойства для Parms в коде выше конкретно является пользователь, имя домена и ReturnValue