Получение серийного номера материнской платы
Я хочу привязать программу к определенному компьютеру, и для этого я хочу использовать серийный номер материнской платы в качестве уникального идентификатора.
Хотя я мог найти несколько примеров для 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 );