【问题标题】:How can I get a list of child processes for a given service in C#?如何在 C# 中获取给定服务的子进程列表?
【发布时间】:2009-07-02 10:25:55
【问题描述】:

我有一项服务,它创建了许多子进程。使用 c# 我需要确定当前正在运行的这些子进程的数量。

例如,我有一个名为“TheService”的服务正在运行。这会产生 5 个子进程,都称为“process.exe”。是否可以确定服务下运行的子进程的数量?本质上,我只需要知道服务/服务进程名称的名称即可知道“process.exe”实例的数量。

【问题讨论】:

    标签: c# windows process service


    【解决方案1】:

    您需要使用 WMI,Win32_Process 类包含父进程 ID。所以一个 WQL 查询(参见 .NET 下 WMI 的 System.Management 命名空间)如下:

    SELECT * FROM Win32_Process 其中 ParentProcessId = n

    用服务的进程ID替换n

    编辑示例代码(基于Arsen Zahray的代码):

    static List<Process> GetChildProcesses(int parentId) {
      var query = "Select * From Win32_Process Where ParentProcessId = "
              + parentId;
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
      ManagementObjectCollection processList = searcher.Get();
    
      var result = processList.Cast<ManagementObject>().Select(p =>
        Process.GetProcessById(Convert.ToInt32(p.GetPropertyValue("ProcessId")));
      ).ToList();
    
      return result;
    }
    

    【讨论】:

    • 这个是否只列出了 32 位进程??
    • @It'satrap: 否(刚刚检查了父级为 32 位,子级为 64 位)。
    • 非常感谢。我自己也验证了。
    • 对此要非常小心(我发现很难)。 Windows 中的根级进程往往是孤立的(wininit.exe、cssrss.exe),但仍具有父 ID。父进程不再存在,因此其 ID 用于新进程。在查询进程的子进程时,也会返回那些孤立的根级进程。解决方案,检查子进程的启动时间,确保它们是在父进程之后启动的。
    【解决方案2】:

    我不确定您所说的“服务名称”究竟是什么意思 - 是 process.exe 吗?

    如果是这样,静态方法 Process.GetProcessesByName() 应该可以解决问题:

    Process[] procs = Process.GetProcessesByName("process");
    Console.WriteLine(procs.Length);
    

    如果我误解了你的问题,请告诉我。

    【讨论】:

    • 对不起,我不是很清楚。仔细考虑之后,我意识到我只需要获取给定进程名称的子进程数。谢谢你的回答。
    • 好的。理查德的答案应该可以解决它。我撤回我的答案,但除非有人反对,否则我会把它留在这里,因为它可能会在未来帮助其他人...... :)
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2023-04-04
    • 1970-01-01
    • 2021-09-28
    • 2021-05-14
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多