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

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

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 相关产品和应用

全部下载

专题列表