Мне нужно написать функцию, которая генерирует идентификатор, уникальный для данной машины под управлением ОС 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
closeEnough
функцию, чтобы я принимал несовпадающий идентификатор, если он изменялся только в двух полях. Я также включаю в свой хэш сведения о процессоре и системном жестком диске, потому что на раннем этапе у меня были конфликты между идентичными системами.У меня была та же проблема, и после небольшого исследования я решил, что лучше всего будет прочитать
MachineGuid
ключ реестраHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
, как предложил @Agnus. Он создается во время установки ОС и не изменится, если вы не установите еще одну новую ОС. В зависимости от версии ОС он может содержать встроенный MAC-адрес сетевого адаптера (плюс некоторые другие числа, в том числе случайные) или псевдослучайное число, более позднее для более новых версий ОС (после XP SP2, я полагаю, но не уверен). Если теоретически это псевдослучайно, то его можно подделать - если две машины имеют одинаковое начальное состояние, включая часы реального времени. На практике это будет редкостью, но имейте в виду, если вы ожидаете, что это будет база для обеспечения безопасности, которая может быть атакована хардкорными хакерами.Конечно, запись в реестре может быть легко изменена кем угодно, чтобы подделать GUID машины, но я обнаружил, что это нарушит нормальную работу такого количества компонентов Windows, что в большинстве случаев ни один обычный пользователь этого не сделает (опять же, будьте осторожны для хардкорных хакеров).
источник
В нашем инструменте лицензирования мы учитываем следующие компоненты
Однако вместо того, чтобы просто хешировать компоненты и создавать систему «годен / не годен», мы создаем сопоставимый «отпечаток пальца», который можно использовать, чтобы определить, насколько разные два профиля машины. Если оценка разницы превышает указанный допуск, попросите пользователя активировать снова.
Мы обнаружили, что за последние 8 лет при использовании сотен тысяч установок конечных пользователей эта комбинация хорошо работает, обеспечивая надежный уникальный идентификатор машины - даже для виртуальных машин и клонированных установок ОС.
источник
Как насчет использования уникального идентификатора процессора?
источник
Я ненавижу быть тем парнем, который говорит: «Ты просто делаешь это неправильно» (я всегда ненавижу этого парня;), но ...
Нужно ли его генерировать повторно для уникальной машины? Могли бы вы просто присвоить идентификатор или сделать открытый / закрытый ключ? Может быть, если бы вы могли сгенерировать и сохранить значение, вы могли бы получить к нему доступ из обеих операционных систем на одном диске?
Вы, вероятно, изучали эти варианты, и они не работают для вас, но если нет, то это следует рассмотреть.
Если это не вопрос доверия пользователей, вы можете просто использовать MAC-адреса.
источник
Вам следует изучить использование MAC-адреса на сетевой карте (если он существует). Они обычно уникальны, но могут быть изготовлены. Я использовал программное обеспечение, которое генерирует файл лицензии на основе MAC-адреса вашего сетевого адаптера, поэтому он считается довольно надежным способом различать компьютеры.
источник
Для одного из своих приложений я использую либо имя компьютера, если он не принадлежит к домену, либо SID учетной записи компьютера домена для компьютеров домена. Марк Руссинович рассказывает об этом в своем блоге Machine SID :
Вы можете получить доступ к SID учетной записи компьютера домена через LDAP или
System.DirectoryServices
.источник
В своей программе я сначала проверяю сервер терминалов и использую WTSClientHardwareId. В противном случае MAC-адрес локального ПК должен быть адекватным.
Если вы действительно хотите использовать список предоставленных вами свойств, опустите такие вещи, как
Name
иDriverVersion
,Clockspeed
и т. Д., Поскольку это, возможно, зависит от ОС. Попробуйте вывести одну и ту же информацию в обеих операционных системах и исключить ту, которая различается между ними.источник
Для получения информации об оборудовании доступна библиотека: Извлечение серийных номеров оборудования (ЦП, ОЗУ, жесткий диск, BIOS).
источник
Почему бы не использовать MAC-адрес вашей сетевой карты?
источник
Возможно, немного обманывают, но MAC-адрес адаптера Ethernet редко меняется без замены материнской платы в наши дни.
источник
Можете вытащить какой нибудь серийный номер производителя или сервисный тег?
Наш магазин является магазином Dell, поэтому для их идентификации мы используем сервисный ярлык, уникальный для каждой машины. Я знаю, что это можно запросить из BIOS, по крайней мере, в Linux, но я не знаю, как это сделать в Windows.
источник
У меня было дополнительное ограничение, я использовал .net express, поэтому я не мог использовать стандартный аппаратный механизм запросов. Поэтому я решил использовать Power Shell для выполнения запроса. Полный код выглядит так:
источник
Найдите CPUID для одного варианта. Могут возникнуть проблемы с многопроцессорными системами.
источник
Попробуйте этот, он дает уникальный идентификатор жесткого диска: Порт DiskId32 для Delphi 7-2010 .
источник