0

我尝试使用 WMI 获取有关 Process Owner 的一些信息。我试图运行这个脚本:

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 方法有关?

谢谢你的帮助!

4

3 回答 3

4

类型错误是因为您的代码中的 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 类型的 com 对象,就像 process 和 proc 一样。它还有其他属性:返回值和域。我可以像上面从参数中获取用户一样轮询它。希望这可以帮助。

抱歉,事后补充:上面代码中parms的属性具体是User、Domain和ReturnValue

于 2014-04-10T03:05:58.397 回答
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]))
于 2013-08-09T13:06:02.090 回答
0

根据接受的答案:

for process in list(psutil.process_iter()):

因为:弃用 psutil.get_process_list() #273

于 2022-03-04T07:17:11.540 回答