如何从ServiceController确定Windows.Diagnostics.Process

Ale*_*lex 11 .net c# wmi windows-services process

这是我的第一篇文章,所以让我先说一下你好!

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

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

有谁知道如何从给定的ServiceController获取Process对象?也许通过确定服务的PID?或者,是否有人有这个问题的另一种解决方法?

非常感谢,Alex

Jus*_*ant 25

在这种情况下,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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)