我正在寻找一些代码,这些代码会基于它的名称来杀死一个进程并拥有它。这在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()
答案 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""")