C#中如何关联逻辑驱动器与对应的物理磁盘
逻辑驱动器与物理磁盘映射实现方案
关联逻辑
逻辑盘符(C:\、D:\这类)和物理磁盘(HDD/SSD/NVMe)没有直接的WMI关联字段,必须通过三层WMI类逐级桥接,链路固定:MSFT_PhysicalDisk(物理盘属性)→ 按DiskNumber/Index匹配 → Win32_DiskDrive(系统磁盘驱动器)→ 通过Win32_DiskDriveToDiskPartition关联 → Win32_DiskPartition(磁盘分区)→ 通过Win32_LogicalDiskToPartition关联 → Win32_LogicalDisk(逻辑盘符)
禁止通过容量近似、盘符顺序做匹配,多分区、虚拟盘、隐藏分区场景下匹配错误率100%
代码实现(C#,基于System.Management)
首先给项目添加System.Management包引用,按以下步骤实现:
- 缓存物理磁盘的介质类型,以磁盘序号为key
// 物理磁盘映射表:key=磁盘序号,value=介质类型 var physicalDiskTypeMap = new Dictionary<int, string>(); var physSearcher = new ManagementObjectSearcher("root\\Microsoft\\Windows\\Storage", "SELECT DiskNumber, MediaType, BusType FROM MSFT_PhysicalDisk"); foreach (ManagementObject physDisk in physSearcher.Get()) { var diskNum = Convert.ToInt32(physDisk["DiskNumber"]); var mediaType = physDisk["MediaType"] switch { 1 => "HDD", 2 => Convert.ToInt32(physDisk["BusType"]) == 3 ? "NVMe" : "SSD", _ => "未知类型" }; physicalDiskTypeMap[diskNum] = mediaType; }
- 缓存磁盘驱动器与物理序号的对应关系,以WMI路径为key
// 磁盘驱动器映射表:key=Win32_DiskDrive的WMI路径,value=物理磁盘序号 var driveIndexMap = new Dictionary<string, int>(); var driveSearcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT __PATH, Index FROM Win32_DiskDrive"); foreach (ManagementObject drive in driveSearcher.Get()) { var wmiPath = drive["__PATH"].ToString(); var diskIndex = Convert.ToInt32(drive["Index"]); driveIndexMap[wmiPath] = diskIndex; }
- 缓存分区与逻辑盘符的对应关系
// 分区映射表:key=Win32_DiskPartition的WMI路径,value=逻辑盘符 var partitionLetterMap = new Dictionary<string, string>(); var partLogicalSearcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Antecedent, Dependent FROM Win32_LogicalDiskToPartition"); foreach (ManagementObject rel in partLogicalSearcher.Get()) { var partitionPath = rel["Antecedent"].ToString(); var logicalObj = new ManagementObject(rel["Dependent"].ToString()); var driveLetter = $"{logicalObj["DeviceID"]}\\"; partitionLetterMap[partitionPath] = driveLetter; }
- 关联全链路得到最终映射结果
// 最终结果表:key=逻辑盘符,value=对应物理盘介质类型 var finalMapping = new Dictionary<string, string>(); var drivePartSearcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Antecedent, Dependent FROM Win32_DiskDriveToDiskPartition"); foreach (ManagementObject rel in drivePartSearcher.Get()) { var drivePath = rel["Antecedent"].ToString(); var partitionPath = rel["Dependent"].ToString(); // 跳过无对应逻辑盘的隐藏分区、恢复分区 if (!driveIndexMap.ContainsKey(drivePath) || !partitionLetterMap.ContainsKey(partitionPath)) continue; var diskIndex = driveIndexMap[drivePath]; var driveLetter = partitionLetterMap[partitionPath]; finalMapping[driveLetter] = physicalDiskTypeMap[diskIndex]; }
输出效果
遍历finalMapping即可得到标准映射结果,常规环境下输出示例:
C:\对应 SSDD:\对应 NVMeE:\对应 HDD
注意事项
- 普通标准用户权限即可查询上述WMI类,无需管理员权限
- 对于挂载到NTFS文件夹的无盘符卷,可替换第三步的盘符提取逻辑,读取
Win32_Volume的挂载路径即可 - U盘、存储卡等可移动介质的MediaType字段可能返回0(未指定),可结合BusType字段补充判断逻辑
- 该匹配逻辑在动态磁盘、存储池、VHD/VHDX挂载场景下依然生效
内容的提问来源于stack exchange,提问作者SammyJ
相关产品推荐
相关产品推荐

