У меня вопрос, как сгенерировать уникальный серийный номер машины в Delphi? Я пытался сделать это, используя идентификатор материнской платы или процессора, но, к сожалению, он поддерживается. Отваливаются порядковые номера разделов и т.п., так как он меняется после форматирования. Ищу то, что не меняется после форматирования. Есть ли у кого-нибудь идеи?
Как сгенерировать уникальный серийный номер машины в Delphi?
Ответы (7)
Внутри библиотеки JCL есть несколько функций, очень полезных для этой темы:
function CPUID: TCpuInfo;
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
function GetVolumeSerialNumber(const Drive: string): string;
function GetBIOSName: string;
То, что вам нужно, на самом деле является своего рода «аппаратным отпечатком пальца», а не «серийным номером». Проблема с этим подходом в том, что он не на 100% надежен. Доказательство: Microsoft не удалось найти способ правильно ограничить OEM-программное обеспечение на каком-либо отдельном компьютере, вы действительно можете переустановить OEM-лицензию на новый компьютер через некоторое время! Как только вы согласитесь, что идеального решения не может быть, вы можете рассмотреть свои варианты и попытаться получить что-то достаточно хорошее.
Для своих приложений я создаю отпечаток пальца на основе информации, возвращаемой GetSystemInfo, GetVolumeInformation и (для раздела 'C:'), и набора ключей реестра из HKLM \ HARDWARE (на самом деле много ключей реестра, все, кроме USB, клавиатуры и мышки). Я читаю информацию об оборудовании из реестра, потому что приложение Windows не может напрямую обращаться к оборудованию (подходы в стиле DOS не работают), и потому что у меня нет времени, чтобы выяснить способы определения информации об оборудовании для много разных устройств.
У моего подхода есть следующие недостатки:
- Использует серийный номер раздела, установленный Format. Формат явно изменил бы отпечаток пальца.
- Использует информацию об установленных драйверах. Обновление драйвера может фактически изменить отпечаток пальца! Перемещение карты с одного порта PCI на другой может изменить отпечаток пальца.
Тем не менее, даже с учетом всей этой изменяющейся информации, я получаю коллизии: что-то вроде 1/1000 компьютеров! Здесь действуют несколько факторов:
- Крупный OEM-производитель создает множество компьютеров на одном и том же оборудовании. Они также клонируют жесткие диски, чтобы ускорить установку программного обеспечения, чтобы разные ПК могли получить один и тот же серийный номер раздела.
- Я создаю очень короткий хеш из всей этой информации, достаточно короткий, чтобы люди могли прочитать его мне по телефону без особых ошибок.
Эта система работает для меня, но она не будет работать для вас, если вы планируете повторно идентифицировать компьютеры после их переустановки.
Вы можете протестировать GLibWMI, который извлекает информацию о нескольких компонентах в Windows.
Это бесплатно и источник включен. Вы можете найти его на моем веб-сайте или в Sourceforge.
альтернативный текст http://img175.imageshack.us/img175/1250/imagen344.png < / а>
Включите компоненты для BIOSInfo, DiskInfo, ProcessorInfo, ...
С помощью этих трех компонентов вы можете получить такую информацию:
альтернативный текст http://img690.imageshack.us/img690/6006/imagen349.png < / а>
Вы можете найти BIN / EXE GenericDemo (все компоненты) здесь; Вы можете проверить всю информацию, которую вы можете получить с помощью этих компонентов.
У меня была похожая проблема еще в старые добрые времена DOS. Я обнаружил, что ПЗУ установленного оборудования, т.е. видеокарта, серийные порты контроллеров дисков и т. д. были доступны напрямую, так как они отображены в памяти. Это означает, что я смог создать список установленного оборудования и использовать его для создания «серийного номера», который однозначно идентифицировал каждый компьютер (до тех пор, пока не были изменены настройки оборудования). Я уверен, что нечто подобное возможно и сегодня.
Посетите http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map, если вы хотите использовать этот подход.
С Уважением
- откровенный
Часто используется MAC-адрес сетевой карты (a), есть несколько способов запросить MAC-адрес (в Delphi), но самый простой / чистый способ - это, вероятно, использовать GetAdaptersInfo API.
Вот простое решение
- Создать GUID
- Сохраните значение Guid в реестре
Используйте значение guid как серийный номер
Если вы беспокоитесь о безопасности, используйте хеш над (Guid + некоторые секретные данные)
Я склонен согласиться с лагерем «это невозможно». По крайней мере, не на 100%, но, вероятно, это можно сделать «достаточно хорошо», чтобы держать в подчинении рядового пользователя.
И если это можно сделать, то, вероятно, это было сделано. Вы проверяли Delpi300 Torry и т. Д. (Возможно, даже sourceforge, хотя вам, возможно, придется перевести на Delphi).
http://www.google.com.sg/search?hl=ru&source=hp&q=How+to+generate+unique+serial+number+of+machine+in+Delphi действительно выглядит многообещающим