Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine Windows.Diagnostics.Process from ServiceController

This is my first post, so let me start by saying HELLO!

I am writing a windows service to monitor the running state of a number of other windows services on the same server. I'd like to extend the application to also print some of the memory statistics of the services, but I'm having trouble working out how to map from a particular ServiceController object to its associated Diagnostics.Process object, which I think I need to determine the memory state.

I found out how to map from a ServiceController to the original image name, but a number of the services I am monitoring are started from the same image, so this won't be enough to determine the Process.

Does anyone know how to get a Process object from a given ServiceController? Perhaps by determining the PID of a service? Or else does anyone have another workaround for this problem?

Many thanks, Alex

like image 502
Alex Avatar asked Oct 15 '09 17:10

Alex


1 Answers

System.Management should work for you in this case. Here's a sample to get you started:

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);
        }
    }
}
like image 107
Justin Grant Avatar answered Sep 23 '22 18:09

Justin Grant