Как сгенерировать уникальный серийный номер машины в Delphi?

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


person noxwow    schedule 05.06.2010    source источник
comment
проверьте этот вопрос stackoverflow.com/questions/1852134/   -  person RRUZ    schedule 06.06.2010
comment
Вы действительно хотите сгенерировать серийный номер, или вы спрашиваете, как обнаружить различные серийные номера, которые уже есть?   -  person Rob Kennedy    schedule 06.06.2010
comment
Что произойдет, если ваш пользователь не всегда находится на одном компьютере? Например, когда он / она работает в среде VDI (виртуальный рабочий стол)?   -  person Remko    schedule 06.06.2010
comment
Думаю, ответ зависит от того, зачем вам это нужно. Т.е. что ты собираешься делать с этой информацией.   -  person Alex    schedule 07.06.2010
comment
Я вижу здесь так много неправильных ответов. Рекомендация: НИКОГДА не используйте «программный» идентификатор / номер (например, mac, wmi, реестр, идентификатор тома). Используйте только настоящие АППАРАТНЫЕ записанные (только для чтения!) Идентификаторы.   -  person Z80    schedule 07.04.2015


Ответы (7)


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

function CPUID: TCpuInfo;
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
function GetVolumeSerialNumber(const Drive: string): string;
function GetBIOSName: string;
person TridenT    schedule 07.06.2010

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

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

У моего подхода есть следующие недостатки:

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

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

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

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

person Cosmin Prund    schedule 07.06.2010
comment
Я думаю, что если вы добавили MAC-адрес основного встроенного адаптера Ethernet (при условии, что он есть), вы сможете устранить коллизии. - person Chris Thornton; 07.06.2010
comment
у вас есть образец или тестовый код для вашего решения? - person peiman F.; 30.03.2014
comment
ID тома ПОЛНОСТЬЮ ненадежен, потому что его можно так легко изменить. - person Z80; 07.04.2015

Вы можете протестировать 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 (все компоненты) здесь; Вы можете проверить всю информацию, которую вы можете получить с помощью этих компонентов.

person Germán Estévez -Neftalí-    schedule 07.06.2010
comment
Я обнаружил, что эта библиотека совершенно ненадежна для этой работы (получение идентификаторов). Библиотека предоставляет информацию об оборудовании, а не идентификаторы оборудования. - person Z80; 07.04.2015

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

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

С Уважением

  • откровенный
person Frank    schedule 06.06.2010
comment
Может ли приложение Delphi действительно получить доступ к произвольной памяти? Насколько я знаю, приложения Windows не должны иметь доступ к памяти, которая не была специально выделена для них ОС! - person Cosmin Prund; 07.06.2010

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

person Remko    schedule 06.06.2010
comment
Просто имейте в виду, что Wi-Fi-карты могут появляться / исчезать по желанию, когда пользователь выключает карту, Windows удаляет ее из списка, и порядок не всегда одинаков. Также MAC-адрес может быть изменен пользователем, если у него есть разрешение на изменение настроек оборудования. - person ; 06.06.2010
comment
MAC-идентификатор или идентификатор тома ПОЛНОСТЬЮ ненадежны, потому что его можно так легко изменить (просто выполните поиск в Google, и вы увидите множество бесплатных инструментов, которые делают это). То же и для WMI. - person Z80; 07.04.2015

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

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

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

person Charles Faiga    schedule 06.06.2010
comment
Это не удовлетворит потребности OP, так как вы никогда не сможете использовать это для идентификации машины позже. то есть, если вы пытаетесь лицензировать какое-то программное обеспечение, чтобы оно могло работать только на этом компьютере, вы не можете сгенерировать новый GUID завтра (или в следующем году, или после того, как они переустановят окна и т. д.) и получить то же самое GUID для идентификации машины. Даже спустя 1 мс это выглядит как другой компьютер. - person Chris Thornton; 07.06.2010
comment
MAC-идентификатор или идентификатор тома ПОЛНОСТЬЮ ненадежны, потому что его можно так легко изменить (просто выполните поиск в Google, и вы увидите множество бесплатных инструментов, которые делают это). То же и для WMI. Но решение реестра ?????????????????? НЕ РЕШЕНИЕ !!!!!! - person Z80; 07.04.2015

Я склонен согласиться с лагерем «это невозможно». По крайней мере, не на 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 действительно выглядит многообещающим

person Mawg says reinstate Monica    schedule 07.06.2010