阅读Windows服务的说明

时间:2013-05-14 15:29:24

标签: c# windows-services

我正在使用C:\Windows\System32\sc.exe(通过System.Diagnostics.Process)通过我自己构建的自定义安装向导创建多个Windows服务。创建的每个服务都将包含一个程序,其中加载了一个或多个模块(由用户通过向导选择)。

加载此向导时,我希望能够告知用户当前安装了哪些模块的服务。我已经使用服务描述(sc description ".....")来编写哪些模块是每个服务的一部分。

但是,我找不到以编程方式读取服务描述的方法。我发现它不属于System.ServiceProcess.ServiceController

,我感到很惊讶

有没有办法通过C#读取服务的描述?

3 个答案:

答案 0 :(得分:1)

这是一种方法:

using System;
using System.Management;

public static string GetServiceDescription(string serviceName)
{
    using (ManagementObject service = new ManagementObject(new ManagementPath(string.Format("Win32_Service.Name='{0}'", serviceName))))
    {
        return service["Description"].ToString();
    }
}

答案 1 :(得分:1)

并非所有服务都在ManagementObject中返回描述,所以最好使用try catch ...

    string cDescription = "";
    ServiceController[] services = ServiceController.GetServices();
    foreach(var serviceItem in services)
    {
        ManagementObject serviceObject = new ManagementObject(new ManagementPath(string.Format("Win32_Service.Name='{0}'", serviceItem.ServiceName)));
        try
        {
            cDescription = serviceObject["Description"].ToString();
        }
        catch(Exception ex)
        {
            cDescription = ex.Message; // or just leave it empty!
        }
    }

答案 2 :(得分:0)

这是一个完整的例子;需要System.ManagementSystem.ServiceProcess个参考:

using System;
using System.Management;
using System.ServiceProcess;

var services = ServiceController.GetServices();
foreach (var service in services)
    using (var serviceObject = new ManagementObject(new ManagementPath(string.Format("Win32_Service.Name='{0}'", service.ServiceName))))
        Console.WriteLine($"{service.ServiceName} - {serviceObject["Description"]?.ToString()}..");