看见网上有很多的方法来获取Windows中的系统服务,但是都不是很完美。
首先第一个用的比较多的是利用ServiceController这个类来获取。使用起来非常简单。
ServiceController[] services = ServiceController.GetServices();
// 遍历系统服务列表
foreach (ServiceController service in services)
{
// 服务名称
string name = service.ServiceName;
// 服务状态
string status = service.Status.ToString();
// 显示名称
string displayName = service.DisplayName;
}
但是获取的信息并不是很全,可以得到显示的名字(DisplayName)和实际服务(ServiceName)名称,启动类型(自动、手动、禁用)也没有,而且中文的描述都没有。
还有的说是通过注册表去取,路径是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 后面加上利用ServiceController取来的服务名字(ServiceName)。
// name 是ServerName不是DisplayName
RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\" + name);
// 镜像路径
string imagePath = regKey.GetValue("ImagePath").ToString();
// 服务描述
string desc = regKey.GetValue("Description","").ToString();
// 服务启动类型: 2 是自动,3 是手动, 4是禁用
int startType = int.Parse(regKey.GetValue("Start", 2).ToString());
结果Description取来很奇怪。是一个类似这样的路径@%systemroot%\system32\appidsvc.dll,-101。
果断这样的方法也是不行的。
网上还有个方法,就是用cmd.exe中的命令“sc”,执行之后获取其中的文字内容,解析字符串。感觉有点傻,不是很推荐,这里代码就不列出来了。
最后发现了WMI这个好东西,直接获取非常给力,用起来也很简单。代码如下:
using System;
using System.Management;
public class Sample
{
public static void Main()
{
ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Service");
foreach (ManagementObject service in mos.Get())
{
Console.Write("DisplayName:" + ObjToStr(service["DisplayName"]) + "\n");
Console.Write("Name:" + ObjToStr(service["Name"]) + "\n");
Console.Write("Caption:" + ObjToStr(service["Caption"]) + "\n");
Console.Write("Description:" + ObjToStr(service["Description"]) + "\n");
Console.Write("Started:" + ObjToStr(service["Started"]) + "\n");
Console.Write("Status:" + ObjToStr(service["Status"]) + "\n");
Console.Write("StartMode:" + ObjToStr(service["StartMode"]) + "\n");
Console.Write("PathName:" + ObjToStr(service["PathName"]) + "\n");
}
}
// 对象转换为字符串
private string ObjToStr(object obj)
{
if (obj == null)
return "";
else
return obj.ToString();
}
}
想要的字段都有了,非常棒。除此之外,如果还想要一些其它的字段和信息,可以使用以下代码获取:
ManagementClass c = new ManagementClass(
new ManagementPath("Win32_Service"));
// 获取所有的可调用的方法
MethodDataCollection methods =
c.Methods;
// 显示出所有方法
Console.WriteLine("方法名称: ");
foreach (MethodData method in methods)
{
Console.WriteLine(method.Name);
}
Console.WriteLine();
// 获取所有的属性
PropertyDataCollection properties =
c.Properties;
// 显示出所有属性
Console.WriteLine("属性名称: ");
foreach (PropertyData property in properties)
{
Console.WriteLine(property.Name);
}
Console.WriteLine();
最终的运行结果如下图:
方法名称:
StartService
StopService
PauseService
ResumeService
InterrogateService
UserControlService
Create
Change
ChangeStartMode
Delete
GetSecurityDescriptor
SetSecurityDescriptor
属性名称:
AcceptPause
AcceptStop
Caption
CheckPoint
CreationClassName
DelayedAutoStart
Description
DesktopInteract
DisplayName
ErrorControl
ExitCode
InstallDate
Name
PathName
ProcessId
ServiceSpecificExitCode
ServiceType
Started
StartMode
StartName
State
Status
SystemCreationClassName
SystemName
TagId
WaitHint
如上所示,如果需要开始,结束,删除服务等,都可以调用这个里面的方法完成。
可以获取的属性字段信息也如上。只需要就从ManagementObject里面取对应的属性即可。