2009-10-15 8 views
10

To jest mój pierwszy post, więc pozwól mi zacząć od powiedzenia HELLO!Jak określić Windows.Diagnostics.Process od ServiceController

Piszę usługę systemu Windows, aby monitorować stan działania wielu innych usług systemu Windows na tym samym serwerze. Chciałbym rozszerzyć tę aplikację, aby wydrukować niektóre statystyki pamięci usług, ale mam problem z ustaleniem sposobu odwzorowania z określonego obiektu ServiceController na powiązany obiekt Diagnostics.Process, który moim zdaniem powinien określić stan pamięci.

Dowiedziałem się, jak zmapować z kontrolera ServiceController do oryginalnej nazwy obrazu, ale wiele usług, które monitoruję, jest uruchamianych z tego samego obrazu, więc to nie wystarczy, aby określić proces.

Czy ktoś wie, jak uzyskać obiekt Process z danego kontrolera ServiceController? Być może przez określenie PID usługi? Lub czy ktoś ma inne obejście tego problemu?

Dziękujemy Alex

Odpowiedz

22

System.Management powinny pracować dla Ciebie w tej sprawie. Oto przykład, aby zacząć:

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