如何从ServiceController确定Windows.Diagnostics.Process

这是我的第一篇文章,所以让我先说一下你好!

我正在编写一个Windows服务来监视同一服务器上许多其他Windows服务的运行状态。 我想扩展应用程序以打印一些服务的内存统计信息,但是我无法解决如何从特定的ServiceController对象映射到其关联的Diagnostics.Process对象,我认为我需要确定内存状态。

我发现了如何从ServiceController映射到原始映像名称,但是我监视的许多服务都是从同一映像启动的,因此这不足以确定进程。

有谁知道如何从给定的ServiceController获取Process对象? 也许通过确定服务的PID? 或者有没有人有这个问题的另一种解决方法?

非常感谢,Alex

在这种情况下,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); } } }