如何可靠获取USB存储驱动器的盘符与硬件序列号?
Windows下获取磁盘盘符与正确序列号的可靠方案
你之前使用的两个WMI查询存在天然缺陷:
ManagementObjectSearcher("SELECT * FROM win32_PnPSignedDriver")返回全量即插即用驱动数据,体量过大,不同厂商驱动返回字段标准不统一,不适合做磁盘信息采集- 直接查询
Win32_DiskDrive没有做分区和逻辑磁盘的关联,天然缺少盘符字段,原生返回的序列号未做标准化处理,容易出现读取错误
推荐通过关联Win32_DiskDrive、Win32_DiskPartition、Win32_LogicalDisk三个WMI类的方式实现需求,可同时拿到映射后的盘符、正确的序列号信息。
实现代码示例
// 需提前添加System.Management程序集引用 using System.Management; // 关联查询WQL语句,直接映射物理磁盘-分区-逻辑盘符的对应关系 var diskQuery = new ManagementObjectSearcher(@" SELECT d.SerialNumber, d.Model, l.DriveLetter FROM Win32_DiskDrive d INNER JOIN Win32_DiskPartition p ON d.DeviceID = p.DiskIndex INNER JOIN Win32_LogicalDisk l ON p.DeviceID = l.DeviceID "); foreach (var diskItem in diskQuery.Get()) { // 标准化处理序列号:去除前后冗余空格,解决90%以上厂商填充格式异常问题 string serial = diskItem["SerialNumber"]?.ToString().Trim() ?? string.Empty; string driveLetter = diskItem["DriveLetter"]?.ToString() ?? string.Empty; string diskModel = diskItem["Model"]?.ToString() ?? string.Empty; // 此处自行处理业务逻辑 Console.WriteLine($"盘符:{driveLetter},磁盘型号:{diskModel},序列号:{serial}"); }
注意事项
部分虚拟磁盘、未分区的外置物理磁盘不存在对应逻辑盘符映射,返回的DriveLetter会为空,可根据业务需求自行过滤这类结果。
如果仍遇到少量磁盘序列号读取错误的情况,可以额外查询Win32_PhysicalMedia类的SerialNumber属性做交叉校验,该属性返回的序列号标准度更高。
内容的提问来源于stack exchange,提问作者s k
相关产品推荐
相关产品推荐

