Ответ 1
В Windows хранится уникальный указатель на машину в реестре по адресу:
HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid
Каков наилучший способ создания уникального идентификатора оборудования в Microsoft Windows с С++, который нелегко подделать (например, с помощью изменения MAC-адреса)?
В Windows хранится уникальный указатель на машину в реестре по адресу:
HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid
Это был серийный номер процессора, но сегодня существует много типов материнских плат, и этот фактор не является точным. MAC-адрес можно легко подделать. Это оставляет нам внутренний серийный номер жесткого диска. См. Также: http://www.codeproject.com/Articles/319181/Haephrati-Searching-for-a-reliable-Hardware-ID
Существует множество "трюков", но единственным реальным "физическим ответом" является "нет, нет решения".
"Машина" - это не что иное, как пассивный автобус с некоторым оборудованием. Хотя каждый кусок железа может предоставить какой-то полезный идентификатор, каждый кусок железа может быть заменен пользователем по любой плохой или порой причине, о которой вы никогда не сможете полностью узнать (поэтому, если вы основываете свои функции на этом, вы создаете проблемы для своего пользователь, и, следовательно, - как следствие - для себя каждый раз, когда оборудование должно быть заменено/повторно инициализировано/переконфигурировано и т.д. и т.д.).
Теперь, если ваша проблема заключается в идентификации машины в контексте, когда многие машины должны взаимодействовать друг с другом, эта роль хорошо играет MAC или IP-адреса или имена хостов. Но будьте готовы к идее, что они не обязательно постоянны в течение длительного периода времени (так что избегайте их жесткого кодирования - вместо этого "обнаруживайте" при любом запуске)
Если ваша проблема - во-первых - определить экземпляр программного обеспечения или лицензию, вам, вероятно, лучше сосредоточиться на другом виде решения: вы продаете лицензии "пользователям" (у пользователя есть деньги, а не на его компьютере!), а не к их "машинам" (чтобы пользователи могли свободно изменять, когда им нужно/нравится без вашего разрешения, поскольку вы не лицензируете оборудование или ОС...), поэтому ваша проблема заключается не в том, чтобы определить машина, но ПОЛЬЗОВАТЕЛЬ (считайте, что одна и та же машина может быть хостом для многих пользователей и что один и тот же пользователь может работать на разных машинах..., вы не можете предполагать/навязывать соотношение 1:1, не сталкиваясь с каким-то видом о проблемах рано или поздно, когда эта идиома, если окажется, больше не подходит).
Идея должна состоять в том, чтобы зарегистрировать пользователей на нескольких достижимых сайтах, дать им ключи, которые вы создаете, и проверить, что одна и та же пара пользователей/ключей не используется временно более, чем согласованное количество раз в течение заданного периода времени, Когда нарушения превышают, или ключи становятся старыми, просто заблокируйте и подождите, пока пользователь обновится.
Как вы можете видеть, ответ в основном зависит от причины вашего вопроса, больше, чем от самого вопроса.
Существуют различные идентификаторы, назначенные аппаратным средствам, которые могут быть прочитаны и объединены для формирования машинного ключа. Например, вы можете получить идентификатор жесткого диска, на котором хранится программное обеспечение, идентификатор proc и т.д. Некоторые из них могут быть установлены более легко, чем другие, но часть силы заключается в объединении нескольких частей вместе, что необязательно достаточно сильные сами по себе.
Вот программа (также доступна как DLL), которая может читать и показывать ваш идентификатор компьютера/оборудования: http://www.soft.tahionic.com/download-hdd_id/index.html
Использовать API-интерфейсы Win32 System HDS. Не читайте реестр, это не имеет никакого смысла.