Определить диск программы в Windows
У меня есть программа для Windows, написанная на C++. Чтобы получить серийный номер диска компьютера, я запускаю "wmic path win32_physicalmedia get SerialNumber" в программе с помощью _popen().
Однако на компьютерах, на которых запущена программа, может быть много дисков, и USB-диски также отображаются в списке.
Как узнать, на каком из приводов установлена программа, которую я запускаю? Спасибо!
1 ответ
Предполагая, что вы все еще хотите сделать это с WMI: прежде всего вам нужен код для чтения свойств WMI в C++. Не нужно повторять здесь, вы можете найти его в разделе Получение кода CPU ID из C#, чтобы быть в C++.
Когда у вас есть этот код, вы можете использовать стат для работы с дисками. Прежде всего, вы должны помнить, как Windows организует диски:
- Каждый физический диск (
Win32_DiskDrive
) сделан перегородками (Win32_DiskPartition
). - Каждый раздел (
Win32_DiskPartition
) является логическим диском (Win32_LogicalDisk
). - Сопоставление между собой осуществляется с помощью
Win32_DiskDriveToDiskPartition
а такжеWin32_LogicalDiskToPartition
,
Вы уже знаете, где вы работаете, тогда вы можете сделать это отображение:
Выбрать из Win32_LogicalDisk
тот, где DeviceID
свойство соответствует драйву, на котором вы работаете:
DeviceID=C:
запрос Win32_LogicalDiskToPartition
и забрать Antecedent
для которого Dependent
имеет идентификатор, который вы ранее нашли:
\\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1" \\REPETTI\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
Теперь вы должны запросить разделы в Win32_DiskPartition
найти тот, где DeviceID
является Disk #1, Partition #1
Однако также Win32_DiskDriveToDiskPartition
использования DeviceID
для этого сопоставления, то вы можете напрямую запросить Win32_DiskDriveToDiskPartition
соответствовать указанному идентификатору:
\\REPETTI\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1" \\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"
Теперь вам просто нужно запросить Win32_DiskDrive
поиск идентификатора устройства \\.\PHYSICALDRIVE1
:
WDC WDxxx ATA Device \\.\PHYSICALDRIVE1 WDC WDxxx ATA Device
И вы можете получить его серийный номер (в этом случае одно и то же свойство доступно в Win32_PhysicalMedia
а также Win32_DiskDrive
в противном случае вы должны искать по его Caption
).
Без WMI
Если вам нужно сделать это без WMI, то это немного сложнее.
- Прежде всего вам необходимо выяснить, на каком физическом диске находится ваш логический диск_ вы можете следовать. Как составить список физических дисков?,
- Если у вас есть имя физического диска, самый простой способ
CreateFile()
открыть диск и получить информацию сDeviceIoControl()
отправка SMART команд. Не думайте, что это всегда так просто: на многих дисках он выйдет из строя и вам понадобятся права администратора. К сожалению, нет единого идеального решения, тогда вам нужно попробовать разные подходы. Лучший и наиболее исчерпывающий код AFAIK для этого написан Линн МакГуайр для своей утилиты DiskId32.