我需要检索安装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的注册表项
答案 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"]);
}