使用PSUTIL杀死进程

时间:2012-08-21 09:01:44

标签: python windows-7 windows-xp

我正在寻找一些代码,这些代码会基于它的名称来杀死一个进程并拥有它。这在Windows XP上工作正常但是当我在Windows 7上运行相同的代码时,我在尝试获取进程的用户名时遇到了Access Denied错误。

有没有更简单的方法可以杀死适用于XP和Win7的进程?

实际上需要检查进程是否由'SYSTEM'拥有,因此我可以检查进程何时完成用户进程,因为SYSTEM进程仍然存在,而且我不关心这个。< / p>

感谢。

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()

5 个答案:

答案 0 :(得分:1)

如果您没有使用PSUTIL杀死进程的权限,则不会使用其他任何内容。首先想到的是UAC,它恰好出现在XP和Windows 7之间。这意味着你的PSUTIL必须从提升的提示运行,这并不奇怪。将清单添加到request elevation

答案 1 :(得分:1)

问题是某些进程没有名称,因此您收到错误。

如果你将它放在一个试块中,它将起作用:

PROCNAME = 'python.exe'
for proc in psutil.process_iter():
  try:
      if proc.name == PROCNAME:
      p = psutil.Process(proc.pid)

      etc..
  except:
    pass

答案 2 :(得分:0)

这只是猜测,但也许UAC阻止Python拥有管理员权限。尝试使用Win 7上的“以管理员身份运行”的方式执行Python(我不记得它在哪里,但它可能涉及以管理员身份启动终端,可以从“开始”菜单执行,然后执行从那里的Python脚本。)

答案 3 :(得分:0)

从2010年10月开始(see issue 114),使用C函数调用获取username(请参阅source中的get_process_username

这意味着它遇到了this previous stackoverflow question

中描述的问题

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

编辑:从我看到的内容中,Python中还存在一个错误,导致比本来更多的AccessDenied错误。来自psutil的SetSeDebug函数在最后调用RevertToSelf,几乎恢复了它所做的所有更改。

答案 4 :(得分:0)

如果psutil不起作用,您可以随时尝试通过os.system使用taskkill(命令提示符) 杀死所有excel实例的示例:

import os
os.system("""taskkill /f /im excel.exe""")
相关问题