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

发布于 2024-07-26 04:05:14 字数 191 浏览 3 评论 0原文

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

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

I have a service which creates a number of child processes. Using c# I need to determine the number of these child processes which are currently running.

For example I have a service running called "TheService". This spawns 5 child processes, all called "process.exe". Is it possible to determine the number of child processes running under the service? Essentially I need to know the number of instances of "process.exe" given only the name of the service/service process name.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

荭秂 2024-08-02 04:05:14

您需要使用 WMI,即 Win32_Process 类包括父进程 ID。 因此,WQL 查询(请参阅 .NET 下 WMI 的 System.Management 命名空间)如下所示:

SELECT * FROM Win32_Process Where ParentProcessId = n

n 替换为服务的进程 ID。

编辑示例代码(基于 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;
}

You need to use WMI, the Win32_Process class includes the parent process id. So a WQL query (see System.Management namespace for WMI under .NET) like:

SELECT * FROM Win32_Process Where ParentProcessId = n

replacing n with the service's process id.

EDIT Sample code (based on code by 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;
}
泪眸﹌ 2024-08-02 04:05:14

我不确定“服务名称”到底是什么意思 - 那是 process.exe 吗?

如果是这样,静态方法 Process.GetProcessesByName() 应该执行以下操作技巧:

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

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

I am not sure exactly what you mean by "the name of the service" - would that be process.exe?

If so, the static method Process.GetProcessesByName() should do the trick:

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

Let me know if I misunderstood your question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文