Process.Kill() 访问被拒绝

问题描述 投票:0回答:6

当我运行以下代码时,会因“访问被拒绝”而引发 Win32Exception。我无法通过搜索找到任何解决方案。我该如何解决这个问题?

foreach (ListViewItem list in showprocesses.SelectedItems)
{
    Process p = System.Diagnostics.Process.GetProcessById(Convert.ToInt32(list.Tag));
    if (p != null)
        p.Kill();
}
c# .net process kill
6个回答
17
投票

如果您没有必要的权限,您通常会收到此错误。您必须是管理员,并且在 win vista 及更高版本中,以提升模式运行您的应用程序/进程。此外,有些进程即使作为管理员也无法杀死,有些进程被认为是系统关键进程等,您可能需要以 system 身份运行,还有一些进程甚至系统也无法杀死,就像防病毒软件或实际的病毒一样,因为他们不希望您杀死他们的进程

另一种可能性是,如果进程已经终止,它也会抛出该异常,请参阅MSDN


4
投票

我在 Windows 8.1 下使用 Delphi 应用程序时遇到了此类问题 我的应用程序正在关闭,但仍在任务管理器的后台进程中。 不可能用 TaskKill 杀死它(尝试过管理模式,“/F”选项,从命令行...) 最后我发现Windows将我的应用程序的一个DLL“标记”为“IgnoreFreeLibrary”。 这就是为什么我的申请没有关闭。 这是注册表的摘录:

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"{MyApplicationPathAndExeName}"="$ IgnoreFreeLibrary<DllWithProblemName.Dll>"

我删除了注册表项,一切都恢复正常。


3
投票

我有同样的问题并使用这些代码来解决问题:

    [DllImport("user32.dll")]
    public static extern int FindWindow(string ClassName, string WindowName);

    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    public const int WM_SYSCOMMAND = 0x0112;
    public const int SC_CLOSE = 0xF060;

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        int HWND = FindWindow(null, "My Window");//window title

        SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, 0);
    }

1
投票

这是我的

ForceKill
的胆量。首先尝试
.Kill()
这个过程。然后尝试通过
taskkill
终止进程,然后尝试通过
wmic
终止进程。

    public static void ForceKill(Process proc)
    {
        // Will only work if started by this instance of the dll.
        try { proc.Kill(); } catch (Exception ex) { }

        // Fallback to task kill
        var taskKilPsi = new ProcessStartInfo("taskkill");
        taskKilPsi.Arguments = $"/pid {proc.Id} /T /F";
        taskKilPsi.WindowStyle = ProcessWindowStyle.Hidden;
        taskKilPsi.UseShellExecute = false;
        taskKilPsi.RedirectStandardOutput = true;
        taskKilPsi.RedirectStandardError = true;
        taskKilPsi.CreateNoWindow = true;
        var taskKillProc = Process.Start(taskKilPsi);
        taskKillProc.WaitForExit();
        string taskKillOutput = taskKillProc.StandardOutput.ReadToEnd(); // Contains success
        string taskKillErrorOutput = taskKillProc.StandardError.ReadToEnd();

        // Fallback to wmic deelete process.
        var wmicPsi = new ProcessStartInfo("wmic");
        wmicPsi.Arguments = $@"process where ""name='{proc.ProcessName}.exe'"" delete";
        wmicPsi.WindowStyle = ProcessWindowStyle.Hidden;
        wmicPsi.UseShellExecute = false;
        wmicPsi.RedirectStandardOutput = true;
        wmicPsi.RedirectStandardError = true;
        wmicPsi.CreateNoWindow = true;
        var wmicProc = Process.Start(wmicPsi);
        wmicProc.WaitForExit();
        string wmicOutput = wmicProc.StandardOutput.ReadToEnd(); // Contains success
        string wmicErrorOutput = wmicProc.StandardError.ReadToEnd();

    }

您可以检查

proc.Kill()
是否成功,或者
taskKillOutput
wmicOutput
是否成功,而不是每次都敲击所有三种方法。
我发现 

success

在管理员启动的进程上会失败,但是

proc.Kill()
taskkill
只要它不是某种受保护的系统进程,似乎就可以正常工作。
    


-3
投票

无需管理员访问权限。但这仅适用于某些过程。


-4
投票

© www.soinside.com 2019 - 2024. All rights reserved.