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

使用ManagementObjectSearcher时WMI查询格式异常问题排查

解决WMI查询指定磁盘的无效查询问题

问题根源

  1. 盘符与物理磁盘的关联逻辑错误:原代码中用DeviceID LIKE '%{driveLetter}%'匹配完全错误,Win32_DiskDrive的DeviceID格式为\\.\PHYSICALDRIVEX,和盘符(如C:)没有直接字符串关联,必须通过WMI的关联类建立映射。
  2. WMI查询语法错误:字符串类型的查询条件必须用单引号包裹,直接拼接DeviceID值会导致语法无效。

修正后的代码

using System;
using System.Management;
using System.IO;

class DiskInfoGetter
{
    static string GetPhysicalDriveDeviceId(string driveLetter)
    {
        DriveInfo driveInfo = new DriveInfo(driveLetter);
        if (driveInfo.DriveType != DriveType.Fixed)
            return null;

        // 步骤1:通过逻辑磁盘获取对应分区
        string logicalDiskQuery = $"ASSOCIATORS OF {{Win32_LogicalDisk.DeviceID='{driveLetter.ToUpper()}'}} WHERE AssocClass=Win32_LogicalDiskToPartition";
        using (var partitionSearcher = new ManagementObjectSearcher(logicalDiskQuery))
        {
            foreach (ManagementObject partition in partitionSearcher.Get())
            {
                // 步骤2:通过分区获取对应物理磁盘
                string diskDriveQuery = $"ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{partition["DeviceID"]}'}} WHERE AssocClass=Win32_DiskPartitionToDiskDrive";
                using (var diskSearcher = new ManagementObjectSearcher(diskDriveQuery))
                {
                    foreach (ManagementObject disk in diskSearcher.Get())
                    {
                        return disk["DeviceID"].ToString();
                    }
                }
            }
        }
        return null;
    }

    static void Main()
    {
        string targetDrive = "C:";
        string deviceId = GetPhysicalDriveDeviceId(targetDrive);
        
        if (string.IsNullOrEmpty(deviceId))
        {
            Console.WriteLine("未找到对应物理磁盘");
            return;
        }

        // 构造正确的WMI查询:字符串值用单引号包裹,处理反斜杠转义
        string query = $"SELECT * FROM Win32_DiskDrive WHERE DeviceID = '{deviceId.Replace("\\", "\\\\")}'";
        Console.WriteLine("WMI QUERY IS : " + query);

        using (var searcher = new ManagementObjectSearcher(query))
        {
            foreach (ManagementObject disk in searcher.Get())
            {
                string model = disk["Model"]?.ToString() ?? "未知";
                string manufacturer = disk["Manufacturer"]?.ToString() ?? "未知";
                string serialNumber = disk["SerialNumber"]?.ToString() ?? "未知";

                Console.WriteLine("物理磁盘信息:");
                Console.WriteLine($"型号: {model}");
                Console.WriteLine($"制造商: {manufacturer}");
                Console.WriteLine($"序列号: {serialNumber}");
                Console.WriteLine($"设备ID: {disk["DeviceID"]}");
            }
        }
    }
}

关键修正点说明

  • 关联类查询:通过Win32_LogicalDiskToPartition将逻辑磁盘(盘符)映射到分区,再通过Win32_DiskPartitionToDiskDrive将分区映射到物理磁盘,这是WMI中获取盘符对应物理磁盘的标准方式。
  • 查询字符串格式化:将DeviceID的值用单引号包裹,同时把原DeviceID中的单个反斜杠替换为两个反斜杠,确保WMI能正确解析。
  • 空值处理:添加?.ToString() ?? "未知"的空值处理,避免空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:15:20