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

Bar*_*ley 4 c# windows service process

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

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

Ric*_*ard 6

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

SELECT * FROM Win32_Process Where ParentProcessId = n

用服务的进程ID 替换n.

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

static List<Process> GetChildPrecesses(int parentId) {
  var query = "Select * From Win32_Process Where ParentProcessId = "
          + parentId;
  ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
  ManagementObjectCollection processList = searcher.Get();

  var result = processList.Select(p =>
    Process.GetProcessById(Convert.ToInt32(p.GetPropertyValue("ProcessId")));
  ).ToList();

  return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 对此要非常小心(我发现了困难的方法)。Windows 中的根级进程往往是孤立的(wininit.exe、cssrss.exe),但仍具有父 ID。父进程不再存在,因此其 ID 用于新进程。在查询进程的子进程时,也会返回那些孤立的根级别进程。解决方案,检查子进程的启动时间,并确保它们在父进程之后启动。 (4认同)