使用psutil杀死进程

7

我想写一些代码,可以根据进程名和拥有者来终止一个进程。在Windows XP上这很好用,但是当我在Windows 7上运行相同的代码时,尝试获取进程用户名时会出现访问被拒绝的错误。

有没有更简单的方法可以终止一个进程,并且适用于XP和Win7?

实际上需要检查进程是否由“SYSTEM”拥有,以便在用户进程结束后检查该进程,因为系统进程仍然存在,而我不关心这个进程。

PROCNAME = 'python.exe'
for proc in psutil.process_iter():
  if proc.name == PROCNAME:
    p = psutil.Process(proc.pid)
  
    if not 'SYSTEM' in p.username:
      proc.kill()

在XP上终止SYSTEM进程也会因访问被拒绝而失败。 - user1351549
你能否在任务管理器中结束 SYSTEM 进程? - Mihai Stan
是的,还有从taskkill,但我需要能够扫描进程列表并找出进程是系统进程还是用户进程,并且我还要检查用户进程是否已完成,然后再清理任何其他实例。 - user1351549
5个回答

3
如果您没有使用PSUTIL的权限来终止进程,那么您也无法使用其他方法。显然,首先想到的是用户账户控制(UAC),它出现在XP和Windows 7之间。这意味着您的PSUTIL必须从提升的提示符中运行,这并不奇怪。请添加一个清单请求提升

1
我在 Windows 7 机器上已经关闭了 UAC(用户账户控制),这不够吗?理想情况下,我希望找到最简单的解决方案。 - user1351549

1
问题在于有些进程没有名称,因此会出现错误。
如果将其放入try块中,它将起作用:
PROCNAME = 'python.exe'
for proc in psutil.process_iter():
  try:
      if proc.name == PROCNAME:
      p = psutil.Process(proc.pid)

      etc..
  except:
    pass

这不是问题所在。如果是,user1351549 将得到 AttributeError 而不是 AccessDenied 异常。另外,请不要使用裸的 except: - dbn

1

从2010年10月开始(请参见问题114),使用C函数调用获取username(请参见源代码

这意味着它会遇到此前的stackoverflow问题中描述的问题

基本上,您可以捕获AccessDenied异常并假定用户是'SYSTEM'或'LOCAL SERVICE'

编辑:从我所看到的情况来看,Python也存在一个错误,导致出现了比应该更多的AccessDenied错误。psutil的SetSeDebug函数在最后调用RevertToSelf,实际上撤消了所有已进行的更改。


0
这只是一个猜测,但可能是UAC阻止Python获得管理员权限。尝试在Win 7上使用“以管理员身份运行”来执行Python(我不记得确切的位置,但它可能涉及启动一个作为管理员的终端,可以从开始菜单中完成,然后从那里执行Python脚本)。

-1

如果psutil无法正常工作,您可以尝试通过os.system(命令提示符)使用taskkill。例如,杀死所有Excel实例:

import os
os.system("""taskkill /f /im excel.exe""")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接