2009-10-15 14 views
10

Esta es mi primera publicación, así que permítanme comenzar diciendo ¡HOLA!Cómo determinar Windows.Diagnostics.Process desde ServiceController

Estoy escribiendo un servicio de Windows para controlar el estado de ejecución de una serie de otros servicios de Windows en el mismo servidor. Me gustaría ampliar la aplicación para que también imprima algunas de las estadísticas de memoria de los servicios, pero estoy teniendo problemas para encontrar la forma de mapear desde un objeto ServiceController particular a su objeto asociado Diagnostics.Process, que creo que necesito determinar el estado de la memoria.

Descubrí cómo asignar un ServiceController al nombre de la imagen original, pero varios de los servicios que estoy monitoreando se inician desde la misma imagen, por lo que esto no será suficiente para determinar el Proceso.

¿Alguien sabe cómo obtener un objeto de proceso de un ServiceController determinado? Tal vez al determinar el PID de un servicio? ¿O alguien más tiene otra solución para este problema?

Muchas gracias, Alex

Respuesta

22

System.Management deben trabajar para usted en este caso. Aquí hay una muestra para que comiences:

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