2012-03-22 13 views
6

Sto lavorando a un programma di installazione per uno dei prodotti della mia azienda. Il prodotto può essere installato più volte e ogni installazione rappresenta un servizio Windows separato. Quando gli utenti aggiornano o reinstallano il programma, vorrei cercare i servizi in esecuzione, trovare i servizi che appartengono al prodotto, e quindi trovare il file eseguibile e il suo percorso per quel servizio. Quindi utilizzare tali informazioni per trovare quale dei servizi l'utente desidera aggiornare/sostituire/installare/ecc. Nel mio esempio di codice qui sotto, vedo il nome del servizio, la descrizione, ecc., Ma non vedo il vero nome del file o percorso. Qualcuno potrebbe dirmi cosa mi manca? Grazie in anticipo!trovare l'effettivo eseguibile e il percorso associato a un servizio Windows utilizzando C#

Il codice che ho è il seguente:

 ServiceController[] scServices; 
     scServices = ServiceController.GetServices(); 

     foreach (ServiceController scTemp in scServices) 
     { 
      if (scTemp.ServiceName == "ExampleServiceName") 
      { 
       Console.WriteLine(); 
       Console.WriteLine(" Service :  {0}", scTemp.ServiceName); 
       Console.WriteLine(" Display name: {0}", scTemp.DisplayName); 

       ManagementObject wmiService; 
       wmiService = new ManagementObject("Win32_Service.Name='" + scTemp.ServiceName + "'"); 
       wmiService.Get(); 
       Console.WriteLine(" Start name:  {0}", wmiService["StartName"]); 
       Console.WriteLine(" Description:  {0}", wmiService["Description"]); 
      } 
     } 
+1

È possibile utilizzare WMI o il registro. Dai un'occhiata a [questa domanda] (http://stackoverflow.com/questions/2728578/how-to-get-phyiscal-path-of-windows-service-using-net). – Gene

+0

Fantastico! Grazie Gene! Usando il mio esempio sopra e il link che hai postato sono riuscito a fare quanto segue: wmiService.GetPropertyValue ("PathName"). ToString() che ha restituito il percorso completo e il nome del file del programma che viene eseduto – Aaron

risposta

9

Potrei sbagliarmi ma la classe ServiceController non fornisce direttamente tali informazioni.

Pertanto, come suggerito da Gene, sarà necessario utilizzare il Registro di sistema o WMI.

Per un esempio di come utilizzare il Registro di sistema, fare riferimento a http://www.codeproject.com/Articles/26533/A-ServiceController-Class-that-Contains-the-Path-t

Se si decide di utilizzare WMI (che io preferirei),

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service"); 
ManagementObjectCollection collection = searcher.Get(); 

foreach (ManagementObject obj in collection) 
{  
    string name = obj["Name"] as string; 
    string pathName = obj["PathName"] as string; 
    ... 
} 

Si può decidere di avvolgere le proprietà necessari in una classe.

Problemi correlati