Создание уникального идентификатора машины
Мне нужно написать функцию, которая генерирует идентификатор, уникальный для данной машины под управлением ОС 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
мы обнаружили за последние 8 лет использования с сотнями тысяч конечных пользователей устанавливает, что эта комбинация хорошо работает, чтобы обеспечить надежно уникальный идентификатор машины-даже для виртуальных машин и клонированной ОС устанавливает.
Я ненавижу быть парнем, который говорит:" Ты просто делаешь это неправильно " (я всегда ненавижу этого парня ;) но...
Он должен быть повторно сгенерирован для уникальной машины? Не могли бы вы просто назначить идентификатор или сделать открытый/закрытый ключ? Может быть, если бы вы могли генерировать и хранить значение, вы могли бы получить доступ к нему из обеих установок ОС на одном диске?
вы, вероятно, изучили эти варианты, и они не работают для вас, но если нет, это что-то, чтобы считать.
Если это не вопрос доверия пользователей, вы можете просто использовать MAC-адреса.
вы должны изучить использование MAC-адреса на сетевой карте (если он существует). Они обычно уникальны, но могут быть сфабрикованы. Я использовал программное обеспечение, которое генерирует файл лицензии на основе MAC-адреса сетевого адаптера, поэтому он считается довольно надежным способом различать компьютеры.
для одного из моих приложений я использую имя компьютера, если это не доменный компьютер, или SID учетной записи компьютера домена для компьютеров домена. Марк Русинович рассказывает об этом в своем блоге, машина SID:
последний случай, когда дублирование SID будет проблемой, если распределенное приложение использует SIDs машины для уникальной идентификации компьютеров. Никакое программное обеспечение Microsoft не делает этого, и использование Sid машины таким образом не работает только для факта что у всех DC есть одна и та же машина SID. Программное обеспечение, основанное на уникальных удостоверениях компьютера, использует либо имена компьютеров, либо SIDs домена компьютера (SID учетных записей компьютеров в домене).
вы можете получить доступ к учетной записи компьютера домена SID через LDAP или System.DirectoryServices
.
в моей программе я сначала проверяю сервер терминалов и использую WTSClientHardwareId. В противном случае MAC-адрес локального ПК должен быть адекватным.
Если вы действительно хотите использовать список свойств, которые вы предоставили, оставить вещи, как Name
и DriverVersion
, Clockspeed
, etc. поскольку это, возможно, зависит от ОС. Попробуйте вывести одну и ту же информацию в обеих операционных системах и оставьте то, что отличается между ними.
возможно, немного обманывает, но 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.