C#获取U盘序列号的方法

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

C#中可以通过WMI查询系统信息来识别连接的U盘并获取其唯一序列号。本文提供完整代码示例。

核心原理

Windows系统中,逻辑驱动器(如Z:)通过Win32_LogicalDiskToPartition类映射到物理分区,进而关联到物理磁盘设备(Win32_DiskDrive)。我们只需遍历该关系表,筛选出InterfaceType为USB的磁盘,即可从设备的PNPDeviceID属性中提取序列号。

准备条件

  • 命名空间引用:项目中需添加对System.Management.dll的引用,并在代码顶部引入using System.Management;。
  • 权限要求:运行程序通常不需要管理员权限即可读取此类基础硬件信息。

操作步骤

第1步:定义数据模型

创建一个静态列表用于存储所有匹配到的U盘序列号。

private List<string> _serialNumber = new List<string>();

第2步:建立逻辑驱动与物理磁盘的映射

使用ManagementObjectSearcher查询Win32_LogicalDiskToPartition实例。对于每个实例:

  • Antecedent字段:包含逻辑分区的对象路径(如 //./PHYSICALDRIVE0\Partition0)。解析出其中的PHYSICALDRIVE编号。
  • Dependent字段:包含逻辑驱动器的对象路径。本例主要利用Antecedent定位物理驱动器。

第3步:筛选USB磁盘并提取序列号

遍历系统中的Win32_DiskDrive,将物理磁盘名称与前一步解析出的编号进行比对。若两者匹配且接口类型为USB,则将该磁盘的PNPDeviceID传入解析函数。

using System.Management;
private List<string> _serialNumber = new List<string>();
/// <summary>
/// 调用这个函数将本机所有U盘序列号存储到_serialNumber中
/// </summary>
private void matchDriveLetterWithSerial()
{
  string[] diskArray;
  string driveNumber;
  var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
  foreach (ManagementObject dm in searcher.Get())
  {
    getValueInQuotes(dm["Dependent"].ToString());
    diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(',');
    driveNumber = diskArray[0].Remove(0, 6).Trim();
    var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
    foreach (ManagementObject disk in disks.Get())
    {
      if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB")
      {
        _serialNumber.Add(parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()));
      }
    }
  }
}
private static string parseSerialFromDeviceID(string deviceId)
{
  var splitDeviceId = deviceId.Split('\\');
  var arrayLen = splitDeviceId.Length - 1;
  var serialArray = splitDeviceId[arrayLen].Split('&');
  var serial = serialArray[0];
  return serial;
}
private static string getValueInQuotes(string inValue)
{
  var posFoundStart = inValue.IndexOf("\"");
  var posFoundEnd = inValue.IndexOf("\"", posFoundStart + 1);
  var parsedValue = inValue.Substring(posFoundStart + 1, (posFoundEnd - posFoundStart) - 1);
  return parsedValue;
}

使用方法

在需要获取序列号的逻辑位置调用上述方法,随后通过_serialNumber.ToArray()即可获得结果。

matchDriveLetterWithSerial();
string[] aa = _serialNumber.ToArray();
for (int i = 0; i < aa.Length; i++)
{
  aa[i].ToString(); //这里就可以拿出现在所有的U盘序列号
}

注意事项

  • 稳定性:不同U盘厂商生成的PNPDeviceID格式可能略有差异。代码中的正则/字符串分割逻辑基于常见的标准格式,若遇到特定品牌无法提取的情况,可能需要调整解析规则。
  • 性能:WMI查询相对较慢。如果频繁调用,建议缓存结果或优化查询范围。
以上就是C#获取U盘序列号的详细内容,更多关于C# USB开发的资料请关注本站其它相关文章!
相关标签:

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

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 算法库。