1

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

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

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

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

4

3 回答 3

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();
    }
}
于 2013-05-14T15:53:42.437 回答
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!
        }
    }
于 2018-07-05T14:45:19.387 回答
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()}..");
于 2018-03-24T19:08:10.820 回答