2009-10-15 14 views
10

Questo è il mio primo post, quindi iniziamo dicendo HELLO!Come determinare Windows.Diagnostics.Process da ServiceController

Sto scrivendo un servizio di Windows per monitorare lo stato di esecuzione di una serie di altri servizi di Windows sullo stesso server. Mi piacerebbe estendere l'applicazione per stampare anche alcune delle statistiche di memoria dei servizi, ma sto avendo problemi a capire come mappare da un particolare oggetto ServiceController al suo oggetto Diagnostics.Process associato, che penso di aver bisogno di determinare lo stato della memoria.

Ho scoperto come mappare da un ServiceController al nome dell'immagine originale, ma alcuni dei servizi che sto monitorando sono avviati dalla stessa immagine, quindi questo non sarà sufficiente per determinare il Processo.

Qualcuno sa come ottenere un oggetto Process da un determinato ServiceController? Forse determinando il PID di un servizio? Oppure qualcuno ha un'altra soluzione per questo problema?

Molte grazie, Alex

risposta

22

System.Management dovrebbe funzionare per voi in questo caso. Ecco un esempio per iniziare:

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