能否获取Environment.SpecialFolder.System对应系统盘的Win32_DiskDrive序列号?
嘿,这个问题确实有点棘手,因为你要的是物理磁盘的厂商序列号(Win32_DiskDrive的SerialNumber),而系统盘符对应的是逻辑卷/分区,两者之间没有直接映射,得通过几层WMI关联才能打通。我来给你拆解清楚步骤和实现方式:
核心关联链路
系统盘符 → Win32_LogicalDisk(逻辑磁盘) → Win32_DiskPartition(磁盘分区) → Win32_DiskDrive(物理磁盘)
具体实现步骤(以C#为例)
因为你用了.NET的Path.GetPathRoot,我直接给你写适配的代码,思路同样适用于其他能调用WMI的语言:
using System; using System.IO; using System.Management; public class PhysicalDiskSerialHelper { public static string GetSystemDiskManufacturerSerial() { // 第一步:获取系统盘符(比如"C:") string systemDriveLetter = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)); if (string.IsNullOrEmpty(systemDriveLetter)) return null; // 第二步:通过盘符找到对应的逻辑磁盘(Win32_LogicalDisk) ManagementObject logicalDisk = null; using (var searcher = new ManagementObjectSearcher( $"SELECT * FROM Win32_LogicalDisk WHERE DriveLetter = '{systemDriveLetter}'")) { foreach (var obj in searcher.Get()) { logicalDisk = obj; break; } } if (logicalDisk == null) return null; // 第三步:从逻辑磁盘关联到磁盘分区(Win32_DiskPartition) ManagementObject targetPartition = null; foreach (var relatedPartition in logicalDisk.GetRelated("Win32_DiskPartition")) { targetPartition = relatedPartition; break; } if (targetPartition == null) return null; // 第四步:从分区关联到物理磁盘(Win32_DiskDrive),提取厂商序列号 foreach (var diskDrive in targetPartition.GetRelated("Win32_DiskDrive")) { // SerialNumber可能带空格,需要Trim处理 string manufacturerSerial = diskDrive["SerialNumber"]?.ToString().Trim(); return manufacturerSerial; } return null; } }
关键注意事项
- 权限要求:这段代码需要以管理员权限运行,否则WMI可能无法返回完整的磁盘信息
- 空值处理:部分虚拟磁盘、未正确识别的磁盘可能没有厂商序列号,要做好空值判断
- 区分序列号类型:别把
Win32_LogicalDisk的VolumeSerialNumber(格式化生成的卷序列号)和Win32_DiskDrive的SerialNumber(厂商烧录的物理序列号)搞混,你要的是后者 - 多分区场景:如果一个物理磁盘上有多个分区,这段代码只会返回系统盘符所在分区对应的物理磁盘序列号,符合你的需求
内容的提问来源于stack exchange,提问作者Spark
相关产品推荐
相关产品推荐

