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


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

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

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

15 ответов:

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

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

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

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

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

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

  • MAC-адрес
  • CPU (не серийный номер, а фактический профиль процессора, такой как шаг и модель)
  • Серийный Номер Системного Диска (Не Метка Тома)
  • CD-ROM model & vendor
  • модель видеокарты и поставщик
  • контроллер IDE
  • контроллер SCSI
, а не просто перемешивания компонентов и создание допусковой системы, мы создаем сопоставимый отпечаток пальца Это можно использовать для определения того, насколько различны два профиля машины. Если оценка разницы выше указанного допуска, то попросите пользователя активировать снова.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

существует библиотека, доступная для получения аппаратной специфической информации:оборудование серийный номер экстрактор (процессора, оперативной памяти, жесткого диска, БИОС)

У меня было дополнительное ограничение, я использовал .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

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

попробуйте этот, он дает уникальный идентификатор жесткого диска: порт DiskId32 для Delphi 7-2010.