2012-12-26 75 views
10

我已经在一个月前安装了Windows 8,并且在进程挂起时一直存在问题,我无法结束/杀死它。任务管理器和CMD Taskkill/f/PID ####都不能完成这项工作,所以我想我会用C#编写我自己的进程杀手,看看出现了什么问题。杀死进程(Windows 8)的问题

在写了一个小应用程序后,我意识到我并不像我想的那么聪明 - 我仍然无法结束这个过程。起初我能找到的名字过程/ PID:

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

..和渐渐当我试图“拒绝访问”异常:

process.Kill(); 

..after尝试几次说改变了,我将无法再找到这个过程。例如。当我试图通过名称或PID找到它时,没有返回任何内容,而该过程仍保留在任务管理器和我的屏幕上。

我也看到了有关过程@MSDN和它说“拒绝访问”,可以抛出,如果该进程已经终止或无法终止.. :(

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

+0

你试过powershell stop-process吗? – tschmit007

回答

11

那么,你基本上遇到了同样的问题,阻止任务管理器终止进程。有两个可能的原因:一个与访问被拒绝的异常相关联,该进程可能已经删除了访问因为你在Windows 8上运行,所以你已经安装了.NET 4.5,它为Process类提供了一个新的方法,你可以调用EnterDebugMode()。这使SeDebugPrivilege,可能足以现在使Kill()工作。

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