C# 通过注册表获取 windows 驱动器硬件标题

C# get windows drive hardware caption via registry

我需要检索安装了 Windows 的驱动器的名称。 我发现最好的方法是通过注册表,因为 WMI 对于这个特定查询来说非常慢。

string diskdrive = Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0", "Identifier", null);

Wich returns:INTEL SSDSCKKF512H6 LBF

虽然这在我的系统中工作得很好,"Target Id" 似乎对其他系统有不同的数字标识符。我将如何去检测特定的目标 ID(也许通过使用注册表子项字符串的一部分来检测它,不知何故)。 甚至不确定这是否适用于其他类型的磁盘(Nvme 或 IDE)。 如果没有 WMi 查询,有更好的方法可以做到这一点。

提前致谢

从 CMD 找到了一些东西:

REG QUERY "HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0" /v Identifier /s

这会在目标 ID 0 中搜索名为 Identifier 的注册表项

好的,那就试试:

此优化版本在我的系统上执行时间约为 65 毫秒。那应该够好了。

//ManagementObject sys = new ManagementObject("Win32_OperatingSystem=@");
//string systemDrive = sys["SystemDrive"].ToString();
//Console.WriteLine("System Drive is {0}", systemDrive);

string strQuery = "ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=\"" 
                + System.IO.Path.GetPathRoot(Environment.SystemDirectory).Replace("\", "") 
                + "\"} WHERE AssocClass = Win32_LogicalDiskToPartition";
RelatedObjectQuery relquery = new RelatedObjectQuery(strQuery);
ManagementObjectSearcher search = new ManagementObjectSearcher(relquery);
UInt32 ndx = 0;
foreach (var diskPartition in search.Get())
{
    ndx = (uint)diskPartition["DiskIndex"];
    Console.WriteLine("Disk Index of System Drive is {0}, Disk Partition is {1}", ndx, diskPartition["DeviceID"]);
}

SelectQuery diskQuery = new SelectQuery(string.Format("SELECT * FROM Win32_DiskDrive WHERE Index={0}", ndx));
ManagementObjectSearcher diskSearch = new ManagementObjectSearcher(diskQuery);
foreach (var disk in diskSearch.Get())
{
    Console.WriteLine("Caption is {0}", disk["Caption"]);
    Console.WriteLine("Serial Number is {0}", disk["SerialNumber"]);
    Console.WriteLine("Model is {0}", disk["Model"]);
    Console.WriteLine("InterfaceType is {0}", disk["InterfaceType"]);
}