C#ntsd.exeによるプロセスのクローズ

3685 ワード

タスクマネージャでプロセスを閉じることができない場合があります.次の方法で強制的に閉じることができます.プロセステーブルのシステムコアプロセスを殺さないように注意してください.1.Windows XP/2000が持参したツールを使用してWindows 2000から、Windowsシステムはユーザー状態デバッグツールNtsdを持参し、ほとんどのプロセスを殺すことができます.デバッガにアタッチされたプロセスはデバッガとともに終了するため、コマンドラインの下でNtsdを使用してプロセスを呼び出し、Ntsdを終了するとプロセスを終了し、Ntsdを使用すると自動的にDebug権限を取得するため、Ntsdはほとんどのプロセスを殺すことができます.操作方法:「開始」/プログラム/添付ファイル/コマンドプロンプトをクリックし、コマンド:ntsd-c q-p PID(最後のPIDを、終了するプロセスのPIDに変更)を入力します.以上のパラメータ-pは後に続くプロセスPIDを示し,-c qはNtsdを終了するデバッグコマンドを実行し,コマンドラインから以上のパラメータを渡せばよい.2.プロセスタスクマネージャが殺せないプロセスを殺すために専用のソフトウェアを使用します.専用のソフトウェアを使用して閉じることができます.
次の方法で、ntsd強制クローズプロセスをC#プログラムで呼び出します.
 public static bool KillProcess(string name, int id, string ntsdPath)
        {
            bool result = false;//           
            Process[] proArr = null;
            if (name == null) name = "";
            name = name.Replace(".EXE", "").Replace(".exe", "");
            try
            {
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "cmd.exe";
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.RedirectStandardError = true;
                    process.StartInfo.CreateNoWindow = true;

                    try
                    {
                        if (id == 0 && (name + "").Length > 0)
                        {
                            proArr = Process.GetProcessesByName(name);
                            if (proArr.Length > 0 && (ntsdPath + "").Length > 0)
                            {
                                foreach (Process pr in proArr)
                                {
                                    //process.StandardInput.WriteLine(ntsdPath + " -c q -p " + pr.Id);//      ID
                                    process.StartInfo.Arguments = "/c " + ntsdPath + " -c q -p " + pr.Id;
                                    process.Start();
                                }
                            }
                        }
                        else
                        {
                            process.StartInfo.Arguments = "/c " + ntsdPath + " -c q -p " + id;
                            process.Start();
                        }
                    }
                    catch (Exception)
                    {

                    }
                }
                //  ntsd.exe
                proArr = Process.GetProcessesByName("ntsd");
                foreach (Process pr in proArr)
                {
                    pr.Kill();
                    result = true;
                }
                //  kill
                if ((name + "").Length > 0)
                {
                    proArr = Process.GetProcessesByName(name);
                    foreach (Process pr in proArr)
                    {
                        pr.Kill();
                        result = true;
                    }
                }
            }
            catch (Exception ex)
            {
                TxtLog.InsertLog(ex, "Helper KillProcess");
            }

            return result;
        }