7

我正在寻找一些代码,这些代码将根据进程的名称和拥有者来终止进程。这在 Windows XP 上运行良好,但是当我在 Windows 7 上运行相同的代码时,在尝试获取进程的用户名时出现访问被拒绝错误。

有没有更简单的方法来杀死一个可以在 XP 和 Win7 上运行的进程?

实际上需要检查该进程是否由“SYSTEM”拥有,因此我可以检查该进程何时完成用户进程,因为 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()
4

5 回答 5

3

如果您没有使用 PSUTIL 终止进程的权限,那么您将不会使用其他任何东西来终止它。首先想到的是UAC,它恰好出现在 XP 和 Windows 7 之间。这意味着您的 PSUTIL 必须从提升的提示符下运行,这不足为奇。添加清单以请求提升

于 2012-08-21T09:08:46.970 回答
1

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

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

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

      etc..
  except:
    pass
于 2013-10-30T09:14:55.833 回答
1

从 2010 年 10 月开始(参见 issue 114),username使用 C 函数调用获得(参见get_process_username代码

这意味着它遇到了上一个 stackoverflow 问题中描述的问题

基本上你可以捕捉到AccessDenied异常并假设用户是“系统”或“本地服务”

编辑:据我所见,Python 中还有一个错误导致更多的 AccessDenied 错误比应该的错误多。SetSeDebug来自 psutil的函数最后调用RevertToSelf,实际上恢复了它所做的所有更改。

于 2012-08-22T15:31:54.843 回答
0

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

于 2012-08-21T09:10:04.667 回答
0

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

import os
os.system("""taskkill /f /im excel.exe""")
于 2020-10-27T08:03:09.753 回答