C # получить заголовок оборудования диска Windows через реестр - PullRequest
0 голосов
/ 01 декабря 2018

Мне нужно получить имя диска, на котором установлена ​​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

Хотя это прекрасно работает в моей системе,«Target Id», кажется, имеет другой цифровой идентификатор для другой системы.Как бы я собирался определить конкретный идентификатор цели (может быть, обнаружить его, используя часть строки подраздела реестра, как-то).Даже не уверен, что это подойдет для дисков других типов (Nvme или IDE).Если есть лучший способ сделать это без запроса WMI.

Заранее спасибо

Найден что-то из CMD:

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

Это ищет ключ реестра с именем Identifierв пределах целевого идентификатора 0

1 Ответ

0 голосов
/ 01 декабря 2018

Хорошо, тогда попробуйте:

Эта оптимизированная версия выполняется в моей системе за ~ 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"]);
}
...