2009-10-15 14 views
10

Đây là bài đăng đầu tiên của tôi, vì vậy hãy để tôi bắt đầu bằng cách nói HELLO!Cách xác định Windows.Diagnostics.Process từ ServiceController

Tôi đang viết dịch vụ cửa sổ để theo dõi trạng thái hoạt động của một số dịch vụ cửa sổ khác trên cùng một máy chủ. Tôi muốn mở rộng ứng dụng cũng in một số số liệu thống kê bộ nhớ của các dịch vụ, nhưng tôi đang gặp khó khăn trong việc lập bản đồ từ một đối tượng ServiceController cụ thể đến đối tượng Diagnostics.Process được kết hợp của nó, mà tôi nghĩ rằng tôi cần xác định trạng thái bộ nhớ.

Tôi đã tìm hiểu cách ánh xạ từ ServiceController đến tên hình ảnh gốc, nhưng một số dịch vụ tôi đang theo dõi bắt đầu từ cùng một hình ảnh, vì vậy điều này sẽ không đủ để xác định Quy trình.

Có ai biết cách lấy đối tượng Process từ một ServiceController đã cho không? Có lẽ bằng cách xác định PID của một dịch vụ? Hoặc người nào khác có cách giải quyết khác cho vấn đề này không?

Rất cám ơn, Alex

Trả lời

22

System.Management sẽ hoạt động cho bạn trong trường hợp này. Dưới đây là mẫu để giúp bạn bắt đầu:

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); 
     } 
    } 
} 
Các vấn đề liên quan