2012-03-22 16 views
6

で検索する私の会社の製品のインストールプログラムで作業しています。この製品は複数回インストールすることができ、各インストールは個別のWindowsサービスを表します。ユーザーがプログラムをアップグレードまたは再インストールするとき、実行中のサービスを調べ、その製品に属するサービスを見つけて、そのサービスの実行可能ファイルとそのパスを探したいと思います。その後、その情報を使用して、ユーザーがアップグレード/置換/インストール/などを望むサービスを見つけます。下のコード例では、サービス名、説明などが表示されますが、実際のファイル名やパスは表示されません。誰かが私に行方不明を教えてもらえますか?前もって感謝します!次のようにWindowsサービスに関連付けられた実際の実行可能ファイルとパスをC#

私が持っているコードは次のとおりです。

 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

+0

驚くばかり!ありがとう、ジーン!上記の私の例とあなたが投稿したリンクを使用して、wmiService.GetPropertyValue( "PathName")を実行することができました.ToString()は、強制されているプログラムのフルパスとファイル名を返しました – Aaron

答えて

9

私は間違っているかもしれないが、ServiceControllerクラスが直接その情報を提供していません。

Geneが示唆するように、レジストリまたはWMIを使用する必要があります。レジストリを使用する方法の例については

、あなたは(私は希望)WMIを使用する場合http://www.codeproject.com/Articles/26533/A-ServiceController-Class-that-Contains-the-Path-t

を参照してください、

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

あなたが必要なプロパティをラップすることを決定することができますクラスで。

関連する問題