2009-10-15 9 views
10

Ceci est mon premier message, alors laissez-moi commencer par dire bonjour! Je suis en train d'écrire un service Windows pour surveiller l'état de fonctionnement d'un certain nombre d'autres services Windows sur le même serveur. Je voudrais étendre l'application pour également imprimer certaines des statistiques de la mémoire des services, mais j'ai du mal à travailler comment mapper d'un objet ServiceController particulier à son objet Diagnostics.Process associé, dont je pense que j'ai besoin pour déterminer l'état de la mémoire.Comment déterminer Windows.Diagnostics.Process de ServiceController

J'ai découvert comment mapper un ServiceController au nom de l'image d'origine, mais un certain nombre de services que je surveille sont démarrés à partir de la même image, ce qui ne sera pas suffisant pour déterminer le Processus.

Est-ce que quelqu'un sait comment obtenir un objet Process d'un ServiceController donné? Peut-être en déterminant le PID d'un service? Ou alors quelqu'un a une autre solution de contournement pour ce problème?

Un grand merci, Alex

Répondre

22

System.Management devraient travailler pour vous dans ce cas. Voici un exemple pour vous aider à démarrer:

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