我尝试使用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方法吗?
谢谢你的帮助!
答案 0 :(得分:3)
类型错误是因为代码中的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对象,就像进程和proc一样。它还有其他属性:返回值和域。我可以像上面那样从parms中获取用户进行轮询。希望这会有所帮助。
抱歉,事后补充: 上面代码中parms的属性具体是User,Domain和ReturnValue
答案 1 :(得分: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]))