C#使用WMI查询USB设备信息示例

Miles
Miles
发布时间:2026-10-15| 5人浏览过
原创

在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 系列重载方法。
  • 动作:
    1. 查询 SELECT * FROM Win32_USBControllerDevice 获取控制器到设备的依赖关系。
    2. 从 Dependent 字段中提取 DeviceID。
    3. 使用正则表达式 VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4} 过滤无VID/PID的虚拟设备。
    4. 根据用户传入的 VendoidID、ProductID 或 ClassGuid 进行二次过滤。
    5. 再次查询 Win32_PnPEntity 填充结构体的详细属性。
  • 完成状态:返回过滤后的 PnPEntityInfo[] 数组。

第2步:直接WQL查询即插即用实体

  • 目的:针对已知特征(如特定服务名或部分设备ID)快速检索设备。
  • 入口:WhoPnPEntity(String PNPDeviceID) 等方法。
  • 动作:
    1. 构建 LIKE 子句(注意将反斜杠替换为下划线以避免WQL异常)。
    2. 执行 SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE ... 。
    3. 匹配成功后解析结果并填充 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#系统开发与硬件交互的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。