2012-03-22 39 views
6

我正在爲我公司的一個產品安裝程序。該產品可以多次安裝,每次安裝代表一個獨立的Windows服務。當用戶升級或重新安裝程序時,我想查找正在運行的服務,查找屬於該產品的服務,然後查找該服務的可執行文件及其路徑。然後使用該信息來查找用戶希望升級/替換/安裝/等的哪一項服務。在我的代碼示例中,我看到服務名稱,描述等,但沒有看到實際的文件名或路徑。有人能告訴我我錯過了什麼嗎?先謝謝你!使用c查找與Windows服務相關的實際可執行文件和路徑#

我的代碼如下:

 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

您可以使用WMI或註冊表。看看[這個問題](http://stackoverflow.com/questions/2728578/how-to-get-phyiscal-path-of-windows-service-using-net)。 – Gene 2012-03-22 19:24:02

+0

太棒了!謝謝基因!使用上面的示例以及您發佈的鏈接,我可以執行以下操作:wmiService.GetPropertyValue(「PathName」)。ToString(),它返回正在執行的程序的完整路徑和文件名 – Aaron 2012-03-22 19:48:49

回答

9

我可能是錯的,但ServiceController類並不直接提供這些信息。

正如Gene所建議的 - 您將不得不使用註冊表或WMI。

有關如何使用註冊表的例子,參考http://www.codeproject.com/Articles/26533/A-ServiceController-Class-that-Contains-the-Path-t

如果你決定使用WMI(我就喜歡),

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

你可以決定來包裝你需要的屬性在一個班級。

相關問題