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

Мне нужно написать функцию, которая генерирует идентификатор, уникальный для данной машины под управлением ОС 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 ответов


анализ 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 (не серийный номер, а фактический профиль процессора, такой как stepping и model)
  • Серийный Номер Системного Диска (Не Метка Тома)
  • модель и поставщик CD-ROM
  • модель видеокарты & поставщик
  • контроллер IDE
  • контроллер SCSI
, а не просто перемешивания компонентов и создание допусковой системы, мы создаем сопоставимый отпечаток пальца Это можно использовать для того чтобы определить как различные 2 профиля машины. Если рейтинг разницы выше указанного допуска, попросите пользователя активировать его снова.

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


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

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

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

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


Как насчет просто использования UniqueID процессора?


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


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

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

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


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

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


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


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


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

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


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


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