C# 使用WMI获取所有服务的信息

看见网上有很多的方法来获取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里面取对应的属性即可。

猜你喜欢

转载自blog.csdn.net/wangmy1988/article/details/116983081