C# 如何在C中获得给定服务的子进程列表?

C# 如何在C中获得给定服务的子进程列表?,c#,windows,process,service,C#,Windows,Process,Service,我有一个创建许多子进程的服务。使用c,我需要确定当前正在运行的这些子进程的数量 例如,我有一个名为服务的服务正在运行。这将产生5个子进程,全部称为process.exe。是否可以确定在该服务下运行的子进程数?本质上,我需要知道process.exe的实例数,只要给出服务的名称/服务进程名称。我不确定您所说的服务名称到底是什么意思-那会是process.exe吗 如果是这样,静态方法应该做到: Process[] procs = Process.GetProcessesByName("proces

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


例如,我有一个名为服务的服务正在运行。这将产生5个子进程,全部称为process.exe。是否可以确定在该服务下运行的子进程数?本质上,我需要知道process.exe的实例数,只要给出服务的名称/服务进程名称。

我不确定您所说的服务名称到底是什么意思-那会是process.exe吗

如果是这样,静态方法应该做到:

Process[] procs = Process.GetProcessesByName("process");
Console.WriteLine(procs.Length);
如果我误解了您的问题,请告诉我。

您需要使用WMI,该类包含父进程id。因此WQL查询请参见.NET下的System.Management namespace for WMI,如:

SELECT * FROM Win32_Process Where ParentProcessId = n 将n替换为服务的进程id

根据以下代码编辑示例代码:


对不起,我不是很清楚。仔细考虑之后,我意识到我只需要获得给定进程名的子进程数。谢谢你的回答。理查德的回答应该能解决这个问题。我收回我的回答,但除非有人反对,否则我将把它留在这里,因为它可能会在将来帮助其他人……:这个列表是否只列出了32位进程???@It'satrap:不,只是检查了父进程是32位,子进程是64位。非常感谢。我自己也证实了。要非常小心,我发现了艰难的道路。Windows中的根级别进程往往是孤立的wininit.exe、cssrss.exe,但仍具有父级ID。父级不再存在,因此其ID用于新进程。查询进程的子进程时,也会返回那些孤立的根级进程。解决方案中,请检查子进程的开始时间,并确保它们是在父进程之后启动的。
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;
}