2012-03-22 8 views
6

Pracuję nad programem instalacyjnym dla jednego z produktów mojej firmy. Produkt można zainstalować wiele razy, a każda instalacja reprezentuje osobną usługę Windows. Gdy użytkownicy aktualizują lub ponownie instalują program, chciałbym wyszukać uruchomione usługi, znaleźć usługi, które należą do produktu, a następnie znaleźć plik wykonywalny i jego ścieżkę do tej usługi. Następnie użyj tych informacji, aby znaleźć jedną z usług, które użytkownik chce uaktualnić/wymienić/zainstalować/etc. W poniższym przykładzie kodu widzę nazwę usługi, opis itp., Ale nie widzę rzeczywistej nazwy pliku lub ścieżki. Czy ktoś mógłby mi powiedzieć, czego mi brakuje? Z góry dziękuję!znajdowanie rzeczywistego pliku wykonywalnego i ścieżki powiązanej z usługą Windows przy użyciu C#

kod mam jest następujący:

 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

Można użyć usługi WMI lub rejestru. Spójrz na [to pytanie] (http://stackoverflow.com/questions/2728578/how-to-get-phyiscal-path-of-windows-service-using-net). – Gene

+0

Awesome! Dziękuję Gene! Korzystając z powyższego przykładu i linku, który opublikowałeś, mogłem wykonać następujące czynności: wmiService.GetPropertyValue ("PathName") ToString(), który zwrócił pełną ścieżkę i nazwę pliku programu, który jest wyłączany – Aaron

Odpowiedz

9

może się mylę ale klasa ServiceController nie zapewniają, że informacje bezpośrednio.

Zgodnie z sugestią Gene'a, będziesz musiał użyć rejestru lub WMI.

Na przykład, w jaki sposób korzystać z rejestru, patrz http://www.codeproject.com/Articles/26533/A-ServiceController-Class-that-Contains-the-Path-t

Jeśli użytkownik zdecyduje się użyć WMI (co wolałbym),

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

Możesz zdecydować się owinąć właściwości, których potrzebujesz w klasie.

Powiązane problemy