Генерация уникального идентификатора машины - PullRequest
98 голосов
/ 19 сентября 2008

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

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

Однако я столкнулся с проблемой, когда машина, которая выполняет двойную загрузку в 2 разных ОС 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

Ответы [ 15 ]

71 голосов
/ 04 мая 2009

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

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

30 голосов
/ 08 марта 2012

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

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

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

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

23 голосов
/ 22 сентября 2008

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

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

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

2 голосов
/ 19 сентября 2008

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

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

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

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

2 голосов
/ 19 сентября 2008

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

1 голос
/ 13 марта 2014

Доступна библиотека для получения информации об оборудовании: Аппаратный экстрактор серийного номера (CPU, RAM, HDD, BIOS)

1 голос
/ 31 марта 2011

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

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

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

1 голос
/ 14 ноября 2008

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

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

1 голос
/ 19 сентября 2008

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

0 голосов
/ 03 июля 2018

У меня было дополнительное ограничение, я использовал .net express, поэтому я не мог использовать стандартный аппаратный механизм запросов. Поэтому я решил использовать Power Shell для выполнения запроса. Полный код выглядит так:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...