【问题标题】:Process.Kill() Access DeniedProcess.Kill() 访问被拒绝
【发布时间】:2013-08-10 08:56:36
【问题描述】:

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

foreach (ListViewItem list in showprocesses.SelectedItems)
{
    Process p = System.Diagnostics.Process.GetProcessById(Convert.ToInt32(list.Tag));
    if (p != null)
        p.Kill();
}

【问题讨论】:

  • 那么它试图杀死什么进程?
  • 您尝试的所有进程或某些特定进程都会出现异常?
  • 我找到了另一个原因;我试图从 32 位进程中终止 64 位进程。我正在从在 IIS 下运行的 Web 应用程序创建一个 Excel 自动化对象,并将“启用 32 位应用程序”设置为 true。这意味着 IIS 正在运行 32 位。安装的 Excel 版本是 64 位。创建/使用 Excel 对象很好,但我无法通过 Process.Kill 将其关闭(这不是必需的,但这是另一个问题)。

标签: c# .net process kill


【解决方案1】:

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

另一种可能性是,如果进程已经终止,它也会抛出那个异常,见MSDN

【讨论】:

  • 我的应用程序在管理员模式下运行。我试图杀死像 Spotify 这样的进程。
  • 你试过在你的应用之外杀死它吗?尝试下载pskill,technet.microsoft.com/en-us/sysinternals/bb896683.aspx,看看你是否可以使用该应用程序杀死它,如果可以,那么你的应用程序有问题(不是在提升模式下运行?你在p中得到了错误的进程?),记得在提升的模式下运行 cmd 提示符,然后从提升的 cmd 提示符调用 pskill
  • 我尝试使用以下代码杀死 spotify:'//foreach (Process proc in Process.GetProcessesByName("spotify")) //{ // proc.Kill(); //}' 它工作得很好。似乎我的原始代码不起作用。那我得看看那个。现在我至少可以处理管理员权限问题了。
  • 尝试 { int procID = System.Convert.ToInt32(showprocesses.SelectedItems[0].SubItems[1].Text);进程 tempProc = Process.GetProcessById(procID); tempProc.Kill(); } catch { MessageBox.Show("无法终止进程", "错误");似乎修补我的代码修复了它。这杀死了选定的进程,没有任何问题:)
【解决方案2】:

我在 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);
        }
    

    【讨论】:

    • 你的回答与这个问题有关吗?
    • 当然! p.Kill();给你一个win32Exception,所以你需要使用user32.dll来关闭其他程序或程序集的窗口。
    【解决方案4】:

    尝试 { pyProcess.Kill(); } catch (异常错误) { Console.WriteLine(error.ToString()); }

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

    【讨论】:

      【解决方案5】:

      在 Windows 上禁用 UAC 解决问题。

      【讨论】:

      • 如果您包含有关如何执行此操作的说明,将会很有帮助。
      • 永远不要这样做。这是一个可怕的建议。
      猜你喜欢
      • 2014-11-30
      • 1970-01-01
      • 2014-08-10
      • 2021-03-06
      • 2011-05-15
      • 2010-09-06
      • 2014-03-22
      • 2018-04-20
      • 2012-08-23
      相关资源
      最近更新 更多