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

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

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

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

#define USER_SERIAL 123456789

double GetMotherBoardSerialNumber();
// ...

double currentSerial = GetMotherBoardSerialNumber();

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

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

2 ответа

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

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

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

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

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

Вы можете посмотреть на этот раздел реестра: [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 );
Другие вопросы по тегам