C# 如何从ServiceController确定Windows.Diagnostics.Process

C# 如何从ServiceController确定Windows.Diagnostics.Process,c#,.net,windows-services,wmi,process,C#,.net,Windows Services,Wmi,Process,这是我的第一篇帖子,所以让我先打个招呼 我正在编写一个windows服务来监视同一服务器上许多其他windows服务的运行状态。我想扩展应用程序以打印服务的一些内存统计信息,但我在解决如何从特定ServiceController对象映射到其关联的Diagnostics.Process对象时遇到了问题,我认为我需要确定内存状态 我发现了如何从ServiceController映射到原始映像名称,但我正在监视的许多服务都是从同一映像启动的,因此这不足以确定流程 有人知道如何从给定的ServiceCo

这是我的第一篇帖子,所以让我先打个招呼

我正在编写一个windows服务来监视同一服务器上许多其他windows服务的运行状态。我想扩展应用程序以打印服务的一些内存统计信息,但我在解决如何从特定ServiceController对象映射到其关联的Diagnostics.Process对象时遇到了问题,我认为我需要确定内存状态

我发现了如何从ServiceController映射到原始映像名称,但我正在监视的许多服务都是从同一映像启动的,因此这不足以确定流程

有人知道如何从给定的ServiceController获取流程对象吗?也许通过确定服务的PID?或者有人有其他解决这个问题的方法吗


非常感谢,Alex

System.Management在这种情况下应该适合您。以下是一个让您开始学习的示例:

using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Management;
class Program
{
    static void Main(string[] args)
    {
        foreach (ServiceController scTemp in ServiceController.GetServices())
        {
            if (scTemp.Status == ServiceControllerStatus.Stopped)
                continue;    // stopped, so no process ID!

            ManagementObject service = new ManagementObject(@"Win32_service.Name='" + scTemp.ServiceName + "'");
            object o = service.GetPropertyValue("ProcessId");
            int processId = (int) ((UInt32) o);
            Process process = Process.GetProcessById(processId);
            Console.WriteLine("Service: {0}, Process ID: {1}", scTemp.ServiceName, processId);
        }
    }
}