Генерация уникального идентификатора компьютера

StackOverflow https://stackoverflow.com/questions/99880

Вопрос

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

Решение

Проанализируйте 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 - адрес
  • Процессор (не серийный номер, а фактический профиль процессора, такой как stepping и модель)
  • Серийный номер системного диска (не метка тома)
  • Память
  • Модель и поставщик CD-ROM
  • Модель и поставщик видеокарты
  • IDE- контроллер
  • Контроллер SCSI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наш магазин является магазином 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top