杀死进程(Windows 8)问题

10

大约一个月前,我安装了Windows 8。最近出现了这样的问题:当某个进程挂起时,我无法结束/杀死它。无论是任务管理器还是CMD Taskkill /f /PID #### 都无法完成该任务,因此我决定用C#编写自己的进程终止器并查看出现了什么问题。

编写了一个小应用程序后,我意识到我并没有那么聪明——我仍然无法结束该进程。起初,我能够通过名称/PID找到该进程:

Process p = Process.GetProcessById(aPid)
//or
foreach (Process p in Process.GetProcessesByName(aProcessName)

当我尝试时,遇到了“访问被拒绝”的异常:

process.Kill();

尝试了几次后,流程发生了变化,我再也找不到它的过程了。例如,当我尝试按名称或PID查找时,什么都没有返回,而进程仍然存在于任务管理器和我的屏幕上。

我还阅读了有关Process @MSDN的内容,它说如果进程已经终止或无法终止,则可能会引发“访问被拒绝”的错误.. :(

需要帮助吗?真的没有强制结束进程的方法吗?


你尝试过使用 PowerShell 的 Stop-Process 命令吗? - tschmit007
1个回答

11

嗯,您实际上遇到了与任务管理器终止进程相同的问题。这有两个可能的原因。其中一个与访问被拒绝的异常相关,该进程可能已删除其他进程获取句柄的访问权限。由于您正在运行Windows 8,因此安装了.NET 4.5。它为Process类提供了一个新方法,您可以调用EnterDebugMode()。这将启用SeDebugPrivilege,可能足以使Kill()起作用。

另一个问题更大,该进程可能有一个在内核模式下仍在运行的线程未退出。诊断的最佳方法是使用任务管理器中的“详细信息”选项卡,右键单击其中一个列标题,然后选择“选择列”。勾选“句柄”。查看进程的显示值。如果您看到非零值,则该进程很可能具有打开的句柄,并正在等待设备驱动程序执行I/O请求。那个设备驱动程序无法受到Windows取消请求的要求。缩小问题制造者的范围并不容易,您必须更多地了解您的进程执行的确切类型的I/O请求。在superuser.com上提出问题以获得更多跟进。


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