使用ManagementObjectSearcher时WMI查询格式异常问题排查
解决WMI查询指定磁盘的无效查询问题
问题根源
- 盘符与物理磁盘的关联逻辑错误:原代码中用
DeviceID LIKE '%{driveLetter}%'匹配完全错误,Win32_DiskDrive的DeviceID格式为\\.\PHYSICALDRIVEX,和盘符(如C:)没有直接字符串关联,必须通过WMI的关联类建立映射。 - 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
相关产品推荐
相关产品推荐

