ManagementObjectSearcher
ManagementObjectSearcher类
ManagementObjectSearcher
用于获取基于指定查询的管理对象集合。是获取管理信息最常用的入口点。
例如,可以遍历所有的硬盘驱动、网络适配器、进程和系统上的其他管理对象,或者查询所有的正在使用、服务停止等的网络连接(query for all network connections that are up, services that are paused, and so on
)。
其查询主要使用的是WMI
查询,以及可选的ManagementScope
,当调用Get()
方法时才会执行对应的查询,返回一个管理对象集合(a collection of management objects
)。
ManagementObjectSearcher
类在System.Management命名空间下。
Environment
类也可以获取一些简单的系统信息,比如:Environment.MachineName
获得计算机名,Environment.UserName
获得操作系统登录用户名,Environment.Is64BitOperatingSystem
是否是64位操作系统,Environment.ProcessorCount
当前系统的处理器数,Environment.NewLine
当前环境的换行符等。
WMI —— Windows Management Instrumentation
WMI是用来获取Windows系统信息(软硬件、网络等)的技术,并提供可供vbs
、powershell
、.NET/C#
等各种工具或编程语言使用的接口。
WMI底层是基于COM的。同时WMI在性能上并不是很好。WMI目前已经不推荐使用,其最新版本(或替代品)为
Windows Management Infrastructure
(MI),它与WMI完全兼容,使用WMI方式可以访问MI,现代编程更推荐直接使用MI。Why Use MI?介绍到,MI使用新的本地API和.NET API(不再需要使用复杂的COM代码与WMI交互),SDK开箱即用,减少开发时间;与PowerShell紧密集成;基于最新的标准。
其具体使用可直接参见官方文档。How to Implement a Managed MI Client
获取常用系统和硬件信息
使用可以访问WMI的ManagementObjectSearcher
对象,可以获取很多需要的计算机的硬件或操作系统的信息。
使用步骤
- 添加引用:
System.Management
- 引入命名空间:
using System.Management;
- 创建
ManagementObjectSearcher
对象,执行查询语句和可选的一些参数。
比如 var searcher = new ManagementObjectSearcher("select * from " + Key);
其中的key为WMI提供的API类,其常用列表见后续
- 调用
searcher.Get()
执行查询,获得ManagementObjectCollection
集合 - 遍历
ManagementObjectCollection
集合获得ManagementObject
- 通过
managementObject[name]
或ManagementObject.GetPropertyValue(name)
获得想要的属性值。
若不知道name
,可以先遍历打印一下:
foreach (var property in managementObject.Properties)
{
Console.WriteLine(property.Name+":"+property.Value);
}
使用实例(ManagementObjectSearcher查询获取)
获取CPU序列号
//获取CPU序列号
public string[] GetCPUSerialNumber()
{
var cpuSerialNumbers = new List<string>();
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Processor"))
{
var moCollects = searcher.Get();
foreach (ManagementObject mo in moCollects)
{
cpuSerialNumbers.Add(mo["ProcessorId"].ToString().Trim());
}
return cpuSerialNumbers.ToArray();
}
}
获取主板序列号
BIOS的serialnumber
有的时候无法获取,会返回Not Applicable
。
//获取主板序列号
public string GetBIOSSerialNumber()
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_BIOS"))
{
string sBIOSSerialNumber = "";
foreach (ManagementObject mo in searcher.Get())
{
sBIOSSerialNumber = mo.GetPropertyValue("SerialNumber").ToString().Trim();
break;
}
return sBIOSSerialNumber;
}
}
获取硬盘序列号
//获取硬盘序列号
public string[] GetHardDiskSerialNumber()
{
var diskSerialNumbers = new List<string>();
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"))
{
foreach (ManagementObject mo in searcher.Get())
{
diskSerialNumbers.Add(mo["SerialNumber"].ToString().Trim());
}
return diskSerialNumbers.ToArray();
}
}
获取网卡地址
可根据需要再排除虚拟机相关网卡。
/// <summary>
/// 获取网卡地址
/// </summary>
/// <returns></returns>
public string[] GetNetCardMACAddress()
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))"))
{
var macSerialNumbers = new List<string>();
foreach (ManagementObject mo in searcher.Get())
{
macSerialNumbers.Add(mo["MACAddress"].ToString().Trim());
}
return macSerialNumbers.ToArray();
}
}
获取串口信息
/// <summary>
/// 获得串口信息。获取的不准确,比如会获取到蓝牙设备
/// </summary>
/// <returns></returns>
public static string[] GetComInfo()
{
List<string> Comstrs = new List<string>();
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity"))
{
var hardInfos = searcher.Get();
foreach (var comInfo in hardInfos)
{
var nameValue = comInfo.Properties["Name"].Value;
if (nameValue != null && nameValue.ToString().Contains("COM")) // 是否需要.ToUpper()?
{
try
{
//通讯端口(COM1) 转变为 COM1:通讯端口
string com = nameValue.ToString();
string[] strcom = com.Split(new char[2] { '(', ')' });
Comstrs.Add(strcom[1] + ":" + strcom[0]);
}
catch { }
}
}
searcher.Dispose();
}
return Comstrs.ToArray();
}
获取一个进程的父进程
/// <summary>
/// 获取父进程。如果出错可能返回null
/// </summary>
/// <param name="process"></param>
/// <returns></returns>
public static Process GetParent(this Process process)
{
try
{
//using (var query = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId=" + process.Id))
using (var query = new ManagementObjectSearcher("root\\CIMV2", "SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" + process.Id))
{
return query
.Get()
.OfType<ManagementObject>()
.Select(p => Process.GetProcessById((int)(uint)p["ParentProcessId"]))
.FirstOrDefault();
}
}
catch
{
return null;
}
}
或
/// <summary>
/// 获取一个进程的父进程Id
/// </summary>
/// <param name="processId"></param>
/// <returns></returns>
public static int ParentProcessId(int processId)
{
try
{
using (var query = new ManagementObjectSearcher("root\\CIMV2", "SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" + processId))
{
return query
.Get()
.OfType<ManagementObject>()
.Select(p =>(int)(uint)p["ParentProcessId"])
.FirstOrDefault();
}
}
catch
{
return 0;
}
}
使用实例(ManagementClass对象方法)
/// <summary>
/// 获取所有的进程
/// </summary>
/// <param name="tb"></param>
public static string ListAllProcesses()
{
// list out all processes and write them into a stringbuilder
using (ManagementClass MgmtClass = new ManagementClass("Win32_Process"))
{
StringBuilder sb = new StringBuilder();
foreach (ManagementObject mo in MgmtClass.GetInstances())
{
sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
sb.Append(Environment.NewLine);
}
return sb.ToString();
}
}
WMI代码生成器介绍(生成C#、VB、VB.Net代码)
WMI Code creator
是微软官方提供的一个生成C#、VB、VB.Net使用WMI代码的工具。
通过它,可以很方便的生成需要的代码,而不用查找需要用到哪些WMI类、去哪找对应的类、属性又是哪些等各种烦人的问题。
点击进入直接下载。
或者从 InvaderZim85/WmiCodeCreator下载一个非官方的比较新的版本。
如下,查询BIOS
使用WMI Code creator
可以执行如下操作:
- 查询WMI命名空间
- 执行方法
- 接收事件通知
- 浏览WMI命名空间。
通过选择Target Computer
,可以生成本地计算机、远程计算机的代码。
附:常见的WMI的API类
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + Key)
查询中常见的key值。
硬件
- Win32_Processor —— CPU 处理器
- Win32_PhysicalMemory —— 物理内存条
- Win32_Keyboard —— 键盘
- Win32_PointingDevice —— 点输入设备,包括鼠标。
- Win32_FloppyDrive —— 软盘驱动器
- Win32_DiskDrive —— 硬盘驱动器
- Win32_CDROMDrive —— 光盘驱动器
- Win32_BaseBoard —— 主板
- Win32_BIOS —— BIOS 芯片
- Win32_ParallelPort —— 并口
- Win32_SerialPort —— 串口
- Win32_SerialPortConfiguration —— 串口配置
- Win32_SoundDevice —— 多媒体设置,一般指声卡。
- Win32_SystemSlot —— 主板插槽 (ISA & PCI & AGP)
- Win32_USBController —— USB 控制器
- Win32_NetworkAdapter —— 网络适配器
- Win32_NetworkAdapterConfiguration —— 网络适配器设置
- Win32_Printer —— 打印机
- Win32_PrinterConfiguration —— 打印机设置
- Win32_PrintJob —— 打印机任务
- Win32_TCPIPPrinterPort —— 打印机端口
- Win32_POTSModem —— MODEM
- Win32_POTSModemToSerialPort —— MODEM 端口
- Win32_DesktopMonitor —— 显示器
- Win32_DisplayConfiguration —— 显卡
- Win32_DisplayControllerConfiguration —— 显卡设置
- Win32_VideoController —— 显卡细节。
- Win32_VideoSettings —— 显卡支持的显示模式。
操作系统
- Win32_TimeZone —— 时区
- Win32_SystemDriver —— 驱动程序
- Win32_DiskPartition —— 磁盘分区
- Win32_LogicalDisk —— 逻辑磁盘
- Win32_LogicalDiskToPartition —— 逻辑磁盘所在分区及始末位置。
- Win32_LogicalMemoryConfiguration —— 逻辑内存配置
- Win32_PageFile —— 系统页文件信息
- Win32_PageFileSetting —— 页文件设置
- Win32_BootConfiguration —— 系统启动配置
- Win32_ComputerSystem —— 计算机信息简要
- Win32_OperatingSystem —— 操作系统信息
- Win32_StartupCommand —— 系统自动启动程序
- Win32_Service —— 系统安装的服务
- Win32_Group —— 系统管理组
- Win32_GroupUser —— 系统组帐号
- Win32_UserAccount —— 用户帐号
- Win32_Process —— 系统进程
- Win32_Thread —— 系统线程
- Win32_Share —— 共享
- Win32_NetworkClient —— 已安装的网络客户端
- Win32_NetworkProtocol —— 已安装的网络协议
- Win32_PnPEntity —— all device