2009-10-15 5 views
10

これは私の最初の投稿ですので、私はHELLOと言って始めましょう!ServiceControllerからWindows.Diagnostics.Processを特定する方法

私は同じサーバー上の他の多くのWindowsサービスの実行状態を監視するWindowsサービスを作成しています。アプリケーションの一部をサービスのメモリ統計情報を出力するように拡張したいのですが、特定のServiceControllerオブジェクトから関連付けられたDiagnostics.Processオブジェクトにマップする方法を試すのに問題があります。メモリ状態を決定する。

ServiceControllerから元のイメージ名にマップする方法を知りましたが、監視しているサービスの数が同じイメージから開始されているため、プロセスを判断するには不十分です。

誰かが特定のServiceControllerからProcessオブジェクトを取得する方法を知っていますか?おそらくサービスのPIDを決定することによって?それとも、誰かがこの問題の別の回避策を持っていますか?

多くのありがとう、Alex

答えて

22

この場合、System.Managementがうまくいくはずです。

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); 
     } 
    } 
} 
関連する問題