Получение серийного номера материнской платы

Я хочу привязать программу к определенному компьютеру, и для этого я хочу использовать
серийный номер материнской платы в качестве уникального идентификатора.

Хотя я мог найти несколько примеров для C # и Java, я не смог найти ничего надежного для C ++ (я читал, что WMI может не работать в зависимости от аппаратного обеспечения), но наверняка есть способ сделать это и в C ++?

редактировать Другими словами, я хочу простую и элементарную систему лицензирования. Чтобы было понятнее, вот как это будет выглядеть:

#define USER_SERIAL 123456789

double GetMotherBoardSerialNumber();
// ...

double currentSerial = GetMotherBoardSerialNumber();

if(currentSerial != USER_SERIAL) {
exit 1;
}

Это, очевидно, не идеально, но у меня нет сервера для настройки системы учетных записей, так что это может быть временным решением.

0

Решение

Вы можете посмотреть на этот раздел реестра: [HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS], Вы увидите следующее:

"BiosMajorRelease""BiosMinorRelease""ECFirmwareMajorRelease""ECFirmwareMinorRelease""BaseBoardManufacturer""BaseBoardProduct""BaseBoardVersion""BIOSReleaseDate""BIOSVendor""BIOSVersion""SystemFamily""SystemManufacturer""SystemProductName""SystemSKU""SystemVersion"

Если вас это не устраивает, вы все равно можете использовать GetSystemInfo функция.
Я думаю, что использование информации о материнской плате не поможет вам как уникальный идентификатор. Если вы хотите получить уникальный идентификатор компьютера, используйте GUID или что-то. Для создания GUID вам нужно просто:

GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid( &gidReference );
2

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

Если вам нужны реальные серийные номера, я бы порекомендовал разобрать таблицу SMBIOS.

В первый раз, когда я погрузился в получение надежных реальных аппаратных идентификаторов, я закончил читать SMBIOS непосредственно из сопоставленной физической памяти (Windows XP). Я пробовал другие подходы, которые многие рекомендуют до этого, но некоторые были очень ненадежными, и при развертывании было отмечено, что на клиентах были дубликаты с некоторыми другими методами. Как могли 20+ человек иметь одинаковые сериалы? Это не имело смысла и казалось, что OEM-производители установили поля.

Начиная с Windows Vista, правильный способ получения таблицы — это GetSystemFirmwareTable. Это связано с тем, что больше невозможно отобразить физическую память в Windows Vista из пользовательского режима (XP64 & Сервер 2003 тоже был такой же)

GetSystemFirmwareTable может использоваться для получения данных SMBIOS, которые затем можно проанализировать в соответствии с SMBIOS спецификация. В таблице достаточно данных, поэтому создание уникального идентификатора не должно быть слишком сложным. IIRC вы вообще даже получаете сериалы для DRAM и т.д …

Я также рекомендовал бы тщательно проверить это и иметь план резервного копирования на случай сбоя вызова. Есть случаи, когда он просто терпит неудачу, и хорошее представление об окружающей среде, которая вызывает сбои, сэкономит вам много времени. Если моя память служит мне прямо в дни Vista, у меня были проблемы с UAC и повышенными привилегиями, однако MS, возможно, изменила это с тех пор!

0

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