C#使用WMI查询USB设备信息示例
在Windows系统中,开发人员经常需要获取USB设备的详细信息,如供应商ID(VID)和产品ID(PID)。利用C#中的Windows Management Instrumentation (WMI) API,可以高效地查询并过滤这些即插即用设备的信息。
准备工作与依赖环境
实现此功能需要在项目中使用 .NET Framework 4 Client Profile 或更高版本,并在 Visual Studio 中添加对 System.Management.dll 的引用。核心代码如下展示了所需的命名空间导入:
using System;
using System.Management;
using System.Text.RegularExpressions;
using System.Collections.Generic;
定义设备数据结构
为了规范化返回的设备信息,首先需要创建一个结构体来映射 Win32_PnPEntity 中的关键字段:
public struct PnPEntityInfo
{
public String PNPDeviceID; // 设备ID
public String Name; // 设备名称
public String Description; // 设备描述
public String Service; // 驱动服务
public String Status; // 当前状态
public UInt16 VendorID; // 供应商标识 (VID)
public UInt16 ProductID; // 产品编号 (PID)
public Guid ClassGuid; // 设备安装类GUID
}
核心查询逻辑实现
所有查询均围绕 ManagementObjectSearcher 展开,主要分为两大策略:一是遍历控制器关联关系获取真实设备实体;二是直接构建WQL查询语句进行筛选。
第1步:基于USB控制器链路的精准获取
- 目的:确保查询的是当前连接且有效的物理USB设备,并具备完整的VID/PID标识。
- 入口:
AllUsbDevices属性或WhoUsbDevice系列重载方法。 - 动作:
- 查询
SELECT * FROM Win32_USBControllerDevice获取控制器到设备的依赖关系。 - 从
Dependent字段中提取DeviceID。 - 使用正则表达式
VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}过滤无VID/PID的虚拟设备。 - 根据用户传入的
VendoidID、ProductID或ClassGuid进行二次过滤。 - 再次查询
Win32_PnPEntity填充结构体的详细属性。
- 查询
- 完成状态:返回过滤后的
PnPEntityInfo[]数组。
第2步:直接WQL查询即插即用实体
- 目的:针对已知特征(如特定服务名或部分设备ID)快速检索设备。
- 入口:
WhoPnPEntity(String PNPDeviceID)等方法。 - 动作:
- 构建 LIKE 子句(注意将反斜杠替换为下划线以避免WQL异常)。
- 执行
SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE ...。 - 匹配成功后解析结果并填充
PnPEntityInfo。
- 重要参数说明:
VendorID/ProductID:若传入UInt16.MinValue则忽略该条件。ClassGuid:例如键盘 GUID 为{4d36e96b-e325-11ce-bfc1-08002be10318}。
常见应用场景与排错
场景一:仅查找特定品牌的USB存储盘。
调用 WhoUsbDevice(VendorID: 0xXXXX, ProductID: 0xYYYY),可精确锁定对应U盘硬件。
场景二:通过驱动服务名称排查故障。
若某USB串口助手无法识别,可通过 WhoUsbDevice(new string[]{"ftdi", "ch340"}) 检查是否加载了对应的驱动服务。
注意事项:
当没有符合条件的设备时,相关静态方法将返回 null。建议在调用处做好空指针判断,或者将其改写为返回空数组以防止空引用异常。此外,对于较新的 Windows 10/11 系统,部分隐藏接口可能需要管理员权限才能被 WMI 访问。
以上就是C#通过WMI查询USB设备信息的详细内容,更多关于C#系统开发与硬件交互的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









