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

时间:2018-11-30 21:51:52

标签: c# key registry partial

我需要检索安装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);

回报丰厚:INTEL SSDSCKKF512H6 LBF

虽然这对我的系统来说是完美的,但“目标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的注册表项

1 个答案:

答案 0 :(得分:0)

好的,然后尝试:

此优化的版本在系统上约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"]);
}