我试图使用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
如何使用这个方法没有错误? 用什么参数或什么标志可能?
我尝试在这里实现和使用这个方法,但是我不能将代码转换为我的情况并获得Process Owner。 =(
或者可能有人知道另一种方法,如何获得有关stream程所有者的信息。 可能与WinApi方法?
谢谢你的帮助!
我会建议使用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]))
类型错误是因为你的代码中的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对象,就像进程和进程一样。 它还具有其他属性:返回值和域。 我可以轮询它,就像我上面从获取用户parms。 希望这可以帮助。
对不起,在事实之后添加:以上代码中的parms属性特别是User,Domain和ReturnValue