Как создать уникальный серийный номер машины в Delphi? - PullRequest
6 голосов
/ 06 июня 2010

У меня вопрос, как сгенерировать уникальный серийный номер машины в Delphi? Я пытался сделать это, используя идентификатор материнской платы или процессора, но, к сожалению, это, к сожалению, поддерживается. Серийные номера разделов и т. Д. Отваливаются, потому что они меняются после форматирования. Я ищу что-то, что не меняется после форматирования. У кого-нибудь есть идеи?

Ответы [ 7 ]

6 голосов
/ 07 июня 2010

Внутри JCL библиотеки, есть несколько функций, очень полезных для этой темы:

function CPUID: TCpuInfo;
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
function GetVolumeSerialNumber(const Drive: string): string;
function GetBIOSName: string;
4 голосов
/ 07 июня 2010

То, что вы ищете, на самом деле является своего рода «аппаратным отпечатком», а не «серийным номером». Проблема этого подхода в том, что он не на 100% надежен. Доказательство: Microsoft не удалось найти способ правильно ограничить OEM-программное обеспечение для любого отдельного компьютера, вы можете переустановить OEM-лицензию на новый компьютер через некоторое время! Как только вы согласитесь, что не может быть идеального решения, вы можете посмотреть на свои варианты и попытаться получить что-то достаточно хорошее.

Для своих приложений я создаю отпечаток на основе информации, возвращаемой GetSystemInfo, GetVolumeInformation и (для раздела 'C:'), и выбора ключей реестра из HKLM \ HARDWARE (на самом деле, много ключей реестра, все, кроме usb , клавиатура и мышь). Я читаю информацию об оборудовании из реестра, потому что приложение Windows не может напрямую получить доступ к оборудованию (подходы в стиле DOS не могут работать), и потому что у меня нет времени, чтобы выяснить способы определения информации, связанной с оборудованием, для много разных устройств.

Мой подход имеет следующие недостатки:

  • Используется серийный номер раздела, установленный в Format. Формат явно изменит отпечаток пальца.
  • Использует информацию об установленных драйверах. Обновление драйвера может фактически изменить отпечаток пальца! Перемещение карты с одного порта PCI на другой может привести к изменению отпечатка пальца.

Тем не менее, даже с учетом всей этой изменяющейся информации, я получаю коллизии: что-то вроде 1/1000 компьютеров! Здесь работают несколько факторов:

  • Большой OEM собирает много компьютеров, используя одно и то же оборудование. Они также клонируют жесткие диски, чтобы ускорить установку программного обеспечения, чтобы разные ПК могли получить один и тот же серийный номер раздела.
  • Я создаю очень короткий хеш из всей этой информации, достаточно короткий, чтобы люди могли читать его мне по телефону без особых ошибок.

Эта система работает для меня, но она не будет работать для вас, если вы собираетесь повторно идентифицировать компьютеры после их переустановки.

3 голосов
/ 07 июня 2010

Вы можете протестировать GLibWMI , который извлекает информацию о нескольких компонентах в Windows.
Это бесплатно и источник включен. Вы можете найти его в my Web или в Sourceforge .

альтернативный текст http://img175.imageshack.us/img175/1250/imagen344.png

Включение компонентов для BIOSInfo, DiskInfo, ProcessorInfo, ...

С помощью этих трех компонентов вы можете получить такую ​​информацию:

альтернативный текст http://img690.imageshack.us/img690/6006/imagen349.png

Вы можете найти BIN / EXE GenericDemo (все компоненты) здесь ; Вы можете проверить всю информацию, которую вы можете получить с помощью этих компонентов.

1 голос
/ 07 июня 2010

Вот простое решение

  • Создать GUID
  • Сохранить значение Guid в реестре
  • Используйте значение направляющей в качестве серийного номера

Если вы беспокоитесь о безопасности, используйте хеш над (Guid + некоторые секретные данные)

1 голос
/ 06 июня 2010

Часто используется MAC-адрес (a) сетевой карты, есть несколько способов запросить MAC-адрес (в Delphi), но самый простой / чистый способ, вероятно, заключается в использовании GetAdaptersInfo API.

1 голос
/ 06 июня 2010

У меня была похожая проблема в старые добрые времена DOS. Я узнал, что в ПЗУ установлено железо т.е. видеокарта, последовательные порты контроллеров дисков и т. д. были доступны напрямую, поскольку они отображены в памяти. Это означает, что я смог создать список установленного оборудования и использовать его для создания «серийного номера», который однозначно идентифицировал каждый компьютер (до тех пор, пока не была изменена настройка оборудования). Я уверен, что нечто подобное возможно и сегодня.

Проверьте http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map,, если хотите использовать этот подход.

Привет

  • Frank
0 голосов
/ 07 июня 2010

Я склонен согласиться с лагерем "это не может быть сделано".По крайней мере, не на 100%, но, вероятно, это можно сделать «достаточно хорошо», чтобы держать обычного пользователя в очереди.

И если это можно сделать, то, вероятно, это было сделано.Вы проверяли Delpi300 от Torry и т. Д. (Возможно, даже Sourceforge, хотя вам, возможно, придется перевести на Delphi).

http://www.google.com.sg/search?hl=en&source=hp&q=How+to+generate+unique+serial+number+of+machine+in+Delphi на самом деле выглядит многообещающе

...