请阅读Windows服务的描述

本文关键字:描述 服务 Windows | 更新日期: 2023-09-27 18:13:45

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

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

然而,我找不到一个方法来以编程方式读取服务的描述。我觉得很奇怪,它不是System.ServiceProcess.ServiceController的一部分

有没有一种方法可以通过c#读取服务的描述?

请阅读Windows服务的描述

有一种方法:

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

不是所有的服务都在managentobject中返回描述,所以最好使用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!
        }
    }

下面是一个完整的例子;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()}..");