У меня есть программа для Windows, написанная на C ++. Чтобы получить серийный номер диска компьютера, я запускаю «wmic path win32_physicalmedia get SerialNumber» в программе с помощью _popen ().
Однако на компьютерах, на которых запущена программа, может быть много дисков, и USB-диски также отображаются в списке.
Как узнать, на каком из приводов установлена программа, которую я запускаю? Спасибо!
Предполагая, что вы все еще хотите сделать это с WMI: прежде всего вам нужен код для чтения свойств WMI в C ++. Не нужно повторять здесь, вы можете найти его в Получение кода 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()
отправка С.М.А.Р.Т. команды. Не думайте, что это всегда так просто: на многих дисках он выйдет из строя и вам понадобятся права администратора. К сожалению, нет единого идеального решения, то вам нужно пытаться разные подходы. AFAIK лучший и самый исчерпывающий код, чтобы справиться с этим, написана Линн Макгуайр для его DiskId32 полезность.Других решений пока нет …