You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包引用,按以下步骤实现:

  1. 缓存物理磁盘的介质类型,以磁盘序号为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;
}
  1. 缓存磁盘驱动器与物理序号的对应关系,以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;
}
  1. 缓存分区与逻辑盘符的对应关系
// 分区映射表: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;
}
  1. 关联全链路得到最终映射结果
// 最终结果表: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:\ 对应 SSD
  • D:\ 对应 NVMe
  • E:\ 对应 HDD

注意事项

  • 普通标准用户权限即可查询上述WMI类,无需管理员权限
  • 对于挂载到NTFS文件夹的无盘符卷,可替换第三步的盘符提取逻辑,读取Win32_Volume的挂载路径即可
  • U盘、存储卡等可移动介质的MediaType字段可能返回0(未指定),可结合BusType字段补充判断逻辑
  • 该匹配逻辑在动态磁盘、存储池、VHD/VHDX挂载场景下依然生效

内容的提问来源于stack exchange,提问作者SammyJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.04 16:18:27