10

私は約1か月前にWindows8をインストールしましたが、プロセスがハングしたときにそれを終了/強制終了できないという問題が発生しました。タスクマネージャーもCMDTaskkill/ f / PID ####もその役割を果たさないので、C#で独自のプロセスキラーを作成して、どのような問題が発生するかを確認することにしました。

小さなアプリを書いた後、私は思ったほど頭が良くないことに気づきました。それでもプロセスを終了することはできません。最初は、名前/PIDでプロセスを見つけることができました。

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

..そして、次のことを試みたときに「アクセスが拒否されました」という例外が発生していました。

process.Kill();

..変更された数回の試行の後、私はもうプロセスを見つけることができません。例えば。名前またはPIDで検索しようとすると、何も返されませんでしたが、プロセスはタスクマネージャーと画面に残っていました。

プロセス@MSDNについても読んだところ、プロセスがすでに終了しているか、終了できなかった場合、「アクセスが拒否されました」がスローされる可能性があると書かれています。:(

ヘルプ?プロセスを強制的に終了する方法は本当にありませんか?

4

1 に答える 1

11

さて、あなたは本質的にタスクマネージャーがプロセスを終了するのを妨げる同じ問題に遭遇しています。考えられる理由は2つあります。1つはアクセス拒否例外に関連付けられており、プロセスが他のプロセスへのアクセス権を削除して、プロセスへのハンドルを取得した可能性があります。Windows 8で実行しているため、.NET4.5がインストールされています。Processクラスに新しいメソッドを提供する、を呼び出すことができますEnterDebugMode()。これにより、SeDebugPrivilegeが機能するようになりますKill()

もう1つははるかに大きな問題であり、プロセスのカーネルモードでアクティブなスレッドが終了していない可能性があります。これを診断する最良の方法は、タスクマネージャの[詳細]タブを使用して、列ヘッダーの1つを右クリックし、[列の選択]を選択することです。「ハンドル」にチェックマークを付けます。プロセスの表示値を確認します。ゼロ以外の値が表示された場合、プロセスはハンドルを開いている可能性が高く、デバイスドライバーがI/O要求を実行するのを待機しています。また、そのデバイスドライバーは、Windowsが要求をキャンセルするように要求することに対して不浸透性です。トラブルメーカーを絞り込むのはそれほど簡単ではありません。プロセスが実行するI/O要求の種類を正確に知る必要があります。superuser.comで質問して、これをフォローアップします。

于 2012-12-26T11:45:28.730 に答える