我正在使用C:\Windows\System32\sc.exe
(通过System.Diagnostics.Process
)通过我自己构建的自定义安装向导创建多个Windows服务。创建的每个服务都将包含一个程序,其中加载了一个或多个模块(由用户通过向导选择)。
加载此向导时,我希望能够告知用户当前安装了哪些模块的服务。我已经使用服务描述(sc description "....."
)来编写哪些模块是每个服务的一部分。
但是,我找不到以编程方式读取服务描述的方法。我发现它不属于System.ServiceProcess.ServiceController
有没有办法通过C#读取服务的描述?
答案 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.Management
和System.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()}..");