代码之家  ›  专栏  ›  技术社区  ›  Alex

如何从ServiceController确定windows.diagnostics.process

  •  11
  • Alex  · 技术社区  · 16 年前

    这是我的第一个帖子,所以让我先打个招呼吧!

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

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

    有人知道如何从给定的ServiceController获取流程对象吗?也许通过确定服务的PID?或者有人有其他解决这个问题的方法吗?

    多谢,亚历克斯

    1 回复  |  直到 15 年前
        1
  •  24
  •   Justin Grant    16 年前

    在这种情况下,系统管理应该为您工作。下面是一个让您开始的示例:

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