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,它说如果进程已经终止或无法终止,则可以抛出“访问被拒绝”.. :(

帮助?真的没有办法强制结束进程吗?

4

1 回答 1

11

好吧,您基本上遇到了阻止任务管理器终止进程的相同问题。有两个可能的原因。一个与拒绝访问异常相关,该进程可能已经删除了对其他进程的访问权限以获取该进程的句柄。由于您在 Windows 8 上运行,因此您已安装 .NET 4.5。它为 Process 类提供了一种新方法,您可以调用EnterDebugMode(). 这使得SeDebugPrivilege, 可能足够好,现在可以Kill()工作了。

另一个是更大的问题,进程可能有一个在内核模式下处于活动状态的线程没有退出。最好的诊断方法是使用任务管理器的详细信息选项卡,右键单击列标题之一并选择“选择列”。勾选“手柄”。查看进程的显示值。如果您看到一个非零值,则该进程很可能打开了句柄并等待设备驱动程序执行 I/O 请求。否则,该设备驱动程序不会受到 Windows 要求它取消请求的影响。缩小麻烦制造者的范围并不容易,您必须更多地了解您的进程执行的 I/O 请求类型。通过在 superuser.com 上询问有关它的问题来跟进此问题

于 2012-12-26T11:45:28.730 回答