Я хочу привязать программу к определенному компьютеру, и для этого я хочу использовать
серийный номер материнской платы в качестве уникального идентификатора.
Хотя я мог найти несколько примеров для C # и Java, я не смог найти ничего надежного для C ++ (я читал, что WMI может не работать в зависимости от аппаратного обеспечения), но наверняка есть способ сделать это и в C ++?
редактировать Другими словами, я хочу простую и элементарную систему лицензирования. Чтобы было понятнее, вот как это будет выглядеть:
#define USER_SERIAL 123456789
double GetMotherBoardSerialNumber();
// ...
double currentSerial = GetMotherBoardSerialNumber();
if(currentSerial != USER_SERIAL) {
exit 1;
}
Это, очевидно, не идеально, но у меня нет сервера для настройки системы учетных записей, так что это может быть временным решением.
Вы можете посмотреть на этот раздел реестра: [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 );
Если вам нужны реальные серийные номера, я бы порекомендовал разобрать таблицу SMBIOS.
В первый раз, когда я погрузился в получение надежных реальных аппаратных идентификаторов, я закончил читать SMBIOS непосредственно из сопоставленной физической памяти (Windows XP). Я пробовал другие подходы, которые многие рекомендуют до этого, но некоторые были очень ненадежными, и при развертывании было отмечено, что на клиентах были дубликаты с некоторыми другими методами. Как могли 20+ человек иметь одинаковые сериалы? Это не имело смысла и казалось, что OEM-производители установили поля.
Начиная с Windows Vista, правильный способ получения таблицы — это GetSystemFirmwareTable. Это связано с тем, что больше невозможно отобразить физическую память в Windows Vista из пользовательского режима (XP64 & Сервер 2003 тоже был такой же)
GetSystemFirmwareTable может использоваться для получения данных SMBIOS, которые затем можно проанализировать в соответствии с SMBIOS спецификация. В таблице достаточно данных, поэтому создание уникального идентификатора не должно быть слишком сложным. IIRC вы вообще даже получаете сериалы для DRAM и т.д …
Я также рекомендовал бы тщательно проверить это и иметь план резервного копирования на случай сбоя вызова. Есть случаи, когда он просто терпит неудачу, и хорошее представление об окружающей среде, которая вызывает сбои, сэкономит вам много времени. Если моя память служит мне прямо в дни Vista, у меня были проблемы с UAC и повышенными привилегиями, однако MS, возможно, изменила это с тех пор!