web-dev-qa-db-ja.com

Process.Kill()アクセスが拒否されました

次のコードを実行すると、Win32ExceptionがAccess Deniedに対してスローされます。検索で解決策を見つけることができません。どうすれば修正できますか?

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

必要な権限がない場合、通常このエラーが発生します。あなたは管理者である必要があり、Vista以降では、アプリ/プロセスを昇格モードで実行します。さらに、管理者としても殺すことができない特定のプロセス、システムがクリティカルであると見なされているプロセスなどがあり、systemとして実行する必要がある場合があります。彼らはあなたが彼らのプロセスを殺したくないので、アンチウイルスや実際のウイルスのようにシステムでさえ殺すことができないものです

別の可能性は、プロセスがすでに終了している場合、その例外もスローすることです [〜#〜] msdn [〜#〜] を参照してください

13
Jason

Delphiアプリケーションでこの種の問題が発生しました。Windows8.1の場合アプリケーションは閉じていましたが、タスクマネージャのバックグラウンドプロセスのままでした。 TaskKillで強制終了することはできません(管理者モード、 "/ F"オプション、コマンドラインから...)最後に、Windowsがアプリケーションの「DLL」を「IgnoreFreeLibrary」と「マーク」していることがわかりました「それが私のアプリケーションが閉じなかった理由です。ここにレジストリの抜粋があります:

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

レジストリエントリを消去すると、すべてが正常に戻りました。

3
Henry Kerval

私は同じ問題を抱えており、これらのコードを使用して問題を解決しました:

    [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
Hamed R

windowsでUACを無効にすると、問題が解決します。

0
abd Radwan