c# - 在 C# 中,如何可靠地终止进程树

标签 c# process

<分区>

在 C# 中,我们使用以下代码来终止进程树。 有时有效,有时无效,可能与 Windows 7 和/或 64 位有关。

它找到给定进程的子进程的方法是通过调用 GetProcesses 获取系统中的所有进程,然后调用 NtQueryInformationProcess 找出父进程的每个进程是给定的过程。 它以递归方式执行此操作以遍历树。

在线文档说不应使用 NtQueryInformationProcess。 相反,有一个名为 EnumProcesses 的东西,但我找不到任何 C# 示例,只能找到其他语言。

在 C# 中终止进程树的可靠方法是什么?

    public static void TerminateProcessTree(Process process)
    {
        IntPtr processHandle = process.Handle;
        uint processId = (uint)process.Id;

        // Retrieve all processes on the system
        Process[] processes = Process.GetProcesses();
        foreach (Process proc in processes)
        {
            // Get some basic information about the process
            PROCESS_BASIC_INFORMATION procInfo = new PROCESS_BASIC_INFORMATION();
            try
            {
                uint bytesWritten;
                Win32Api.NtQueryInformationProcess(proc.Handle, 0, ref procInfo,
                    (uint)Marshal.SizeOf(procInfo), out bytesWritten); // == 0 is OK

                // Is it a child process of the process we're trying to terminate?
                if (procInfo.InheritedFromUniqueProcessId == processId)
                {
                    // Terminate the child process (and its child processes)
                    // by calling this method recursively
                    TerminateProcessTree(proc);
                }
            }
            catch (Exception /* ex */)
            {
                // Ignore, most likely 'Access Denied'
            }
        }

        // Finally, terminate the process itself:
        if (!process.HasExited)
        {
            try
            {
                process.Kill();
            }
            catch { }
        }
    }

最佳答案

使用 ManagmentObjectSearcher 和一点递归:

private static void KillProcessAndChildren(int pid)
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher
      ("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
        Process proc = Process.GetProcessById(pid);
        proc.Kill();
    }
    catch (ArgumentException)
    {
        // Process already exited.
    }
 }

关于c# - 在 C# 中,如何可靠地终止进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23845395/

相关文章:

创建线程后调用execv

c# - 在同一张表的主键上创建外键约束的不良做法?

c# - ServiceNow 表 API 返回重复项/不返回所有记录

c# - 如何在 C# 中使用通用接口(interface)从子对象引用父对象?

c++ - 自动 cout 冲洗

java - 在不关闭 InputStream 的情况下中断 BufferedReader#readLine()

c# - 您如何使用自己的控件创建自定义 GTK# 小部件?

c# - 使用 Linq 从在线 XML 文件中读取数据

Args 的 Node.js 子进程问题 - 引号问题?,FFMPEG 问题?

python - 窗口声称可见,但实际不可见