Определить диск программы в Windows

У меня есть программа для Windows, написанная на C ++. Чтобы получить серийный номер диска компьютера, я запускаю «wmic path win32_physicalmedia get SerialNumber» в программе с помощью _popen ().

Однако на компьютерах, на которых запущена программа, может быть много дисков, и USB-диски также отображаются в списке.

Как узнать, на каком из приводов установлена ​​программа, которую я запускаю? Спасибо!

2

Решение

Предполагая, что вы все еще хотите сделать это с 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 полезность.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]