Как определить Windows.Diagnostics.Process из ServiceController

Это мой первый пост, поэтому позвольте мне начать с HELLO!

Я пишу службу Windows, чтобы отслеживать текущее состояние ряда других служб Windows на одном сервере. Я хотел бы расширить приложение, чтобы также распечатать некоторую статистику памяти служб, но у меня возникли проблемы с разработкой того, как сопоставить объект определенного объекта ServiceController с его ассоциированным объектом Diagnostics.Process, который, как мне кажется, мне нужно определить состояние памяти.

Я узнал, как сопоставить с ServiceController исходное имя изображения, но ряд сервисов, которые я контролирую, запускается с одного и того же изображения, поэтому этого недостаточно для определения процесса.

Кто-нибудь знает, как получить объект Process от данного ServiceController? Возможно, определяя PID услуги? Или у кого-нибудь есть другой способ обхода проблемы?

Большое спасибо, Алекс

Ответ 1

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);
        }
    }
}