Создание уникального идентификатора машины

Мне нужно написать функцию, которая генерирует идентификатор, который уникален для данного компьютера, на котором установлена ​​ОС Windows.

В настоящее время я использую WMI для запроса различных параметров оборудования и объединения их вместе и хэш их для получения уникального идентификатора. Мой вопрос: каковы предлагаемые параметры, которые я должен использовать? В настоящее время я использую комбинацию данных bios\cpu\disk для генерации уникального идентификатора. И я использую первый результат, если для каждой метрики есть несколько результатов.

Однако я столкнулся с проблемой, когда машина, которая дважды загружается в две разные ОС Windows, генерирует разные коды сайтов для каждой ОС, чего в идеале не должно быть.

Для справки, это метрики, которые я использую в настоящее время:

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

Ответ 1

Соберите SMBIOS и хеш его произвольной длины. См. Спецификация PDF для всех доступных структур SMBIOS.

Чтобы запросить информацию SMBIOS из Windows, вы можете использовать EnumSystemFirmwareEntries, EnumSystemFirmwareTables и GetSystemFirmwareTable.

IIRC, "уникальный идентификатор" из инструкции CPUID устарел от P3 и новее.

Ответ 2

У меня была такая же проблема, и после небольшого исследования я решил, что лучше всего прочитать MachineGuid в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, как предположил @Agnus. Он создается во время установки ОС и не изменится, если вы не сделаете еще одну новую установку ОС. В зависимости от версии ОС он может содержать встроенный MAC-адрес сетевого адаптера (плюс некоторые другие номера, включая случайные), или псевдослучайное число, а для более поздних версий ОС (после XP SP2, я считаю, но не уверен). Если это псевдослучайно теоретически, это может быть подделано - если две машины имеют одинаковое начальное состояние, включая часы реального времени. На практике это будет редко, но имейте в виду, если вы ожидаете, что это будет базой для безопасности, на которую могут напасть хардкорные хакеры.

Конечно, запись в реестре также может быть легко изменена кем-либо, чтобы подделать GUID машины, но я обнаружил, что это нарушит нормальную работу столь многих компонентов Windows, что в большинстве случаев обычный пользователь этого не сделает (снова, следите за хардкор-хакерами).

Ответ 3

Используя наш инструмент лицензирования, мы рассмотрим следующие компоненты

  • MAC-адрес
  • CPU (Не серийный номер, а фактический профиль процессора, например, степпинг и модель)
  • Серийный номер системного диска (без метки тома)
  • Память
  • Модель и поставщик компакт-дисков
  • Модель и поставщик видеокарты
  • Контроллер IDE
  • Контроллер SCSI

Однако, вместо того, чтобы просто хэшировать компоненты и создавать систему pass/fail, мы создаем сопоставимый отпечаток который можно использовать для определения того, как разные два профиля машины, Если номинал разницы превышает заданный допуск, попросите пользователя снова активировать его.

Мы нашли за последние 8 лет использование сотен тысяч конечных пользователей, что эта комбинация работает хорошо, чтобы обеспечить надежный уникальный идентификатор машины - даже для виртуальных машин и клонированных ОС.

Ответ 4

Как насчет использования уникального идентификатора процессора?

Ответ 5

Я ненавижу быть парнем, который говорит: "Ты просто делаешь это неправильно" (я всегда ненавижу этого парня;), но...

Должна ли она повторяться для уникальной машины? Не могли бы вы просто назначить идентификатор или сделать общедоступный/закрытый ключ? Может быть, если бы вы могли сгенерировать и сохранить значение, вы могли бы получить к нему доступ из обеих ОС на одном диске?

Вероятно, вы изучили эти параметры, и они не сработают для вас, но если нет, подумайте об этом.

Если это не вопрос доверия пользователей, вы можете просто использовать MAC-адреса.

Ответ 6

Вы должны изучить MAC-адрес сетевой карты (если она существует). Они обычно уникальны, но могут быть сфабрикованы. Я использовал программное обеспечение, которое генерирует файл лицензии на основе MAC-адреса вашего сетевого адаптера, поэтому он считает довольно надежным способ отличить компьютеры.

Ответ 7

В моей программе я сначала проверяю Terminal Server и использую WTSClientHardwareId. Иначе MAC-адрес локального ПК должен быть адекватным.

Если вы действительно хотите использовать список свойств, которые вы предоставили, не учитывайте такие вещи, как Name и DriverVersion, Clockspeed и т.д., так как это зависит от ОС. Попробуйте вывести одну и ту же информацию в обе операционные системы и не учитывать то, что отличается от нее.

Ответ 8

Для одного из моих приложений я либо использую имя компьютера, если это компьютер без домена, либо идентификатор SID учетной записи компьютера домена для компьютеров домена. Марк Руссинович говорит об этом в этом сообщении блога, Machine SID:

В последнем случае, когда дублирование SID будет проблемой, если распределенное приложение использует идентификаторы SID машины для уникальной идентификации компьютеров. Никакое программное обеспечение Microsoft не делает этого и использование SID машины таким образом не работает только для того, что все контроллеры домена имеют одинаковый идентификатор SID машины. Программное обеспечение, основанное на уникальных идентификаторах компьютеров, либо использует имена компьютеров, либо идентификаторы SID домена компьютера (SID учетных записей компьютеров в Домене).

Вы можете получить доступ к SID учетной записи компьютера домена через LDAP или System.DirectoryServices.

Ответ 9

Почему бы вам не использовать MAC-адрес вашей сетевой карты?

Ответ 10

Возможно, немного обманывает, но MAC-адрес Ethernet-адаптера компьютеров редко меняется без изменения материнской платы в эти дни.

Ответ 11

Вы можете вытащить какой-либо серийный номер производителя или тег службы?

Наш магазин - магазин Dell, поэтому мы используем тег сервиса, который уникален для каждой машины, чтобы идентифицировать их. Я знаю, что он может быть запрошен из BIOS, по крайней мере, в Linux, но я не знаю, как это сделать в Windows.

Ответ 13

Найдите CPUID для одного параметра. Могут возникнуть некоторые проблемы с многопроцессорными системами.