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


104

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

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

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

Ответы:


25

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

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

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


14
Обратите внимание, что для этих функций требуется как минимум Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 или Windows Server 2003 с SP1.
jcoffland

33
Замечание, чтобы не делать того, что я сделал, а именно: вызвать GetSystemFirmwareTable ('RSMB' ...); и хеширует весь буфер SMBIOSTableData. Он работал отлично, пока я не наткнулся на рабочую станцию, которая записала в эту таблицу внутреннюю температуру процессора, то есть мой уникальный идентификатор менялся каждые несколько секунд.
Thomas

Есть ли исходный код для этого решения?
Just Shadow

@Thomas, а какое решение вы в конце концов выбрали?
Смит

@Smith Моей целью был маленький 8-значный идентификатор. Читая спецификацию, я решил, какие поля могут отличаться, и исключил их. Затем в течение многих лет я вырезал из машин больше полей, которые не являются постоянными. Наконец, я закончил тем, что сохранил зашифрованную копию необработанных данных, которые я использовал в качестве входных, и создал closeEnoughфункцию, чтобы я принимал несовпадающий идентификатор, если он изменялся только в двух полях. Я также включаю в свой хэш сведения о процессоре и системном жестком диске, потому что на раннем этапе у меня были конфликты между идентичными системами.
Томас

72

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

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


6
Я думаю, вы можете использовать флаг KEY_WOW64_64KEY, чтобы убедиться, что вы всегда получаете «настоящую» версию ключа реестра.
Colen

13
Если вы клонируете образ диска, он останется прежним. Так что это совсем небезопасно и очень небезопасно.
bitbonk 08

19
Чтобы прояснить этот момент, когда я использую меры DRM в программном обеспечении, моя главная цель - не дать людям создать взлом, который позволяет «профессиональным» пиратам без каких-либо ограничений продавать нелегальные копии программного обеспечения. Меня не особо беспокоит случайный хакер, который клонирует диск своего друга только для того, чтобы использовать мое программное обеспечение. В таких случаях у этих людей обычно больше времени, чем денег, и они все равно не будут за это платить. Если программное обеспечение стоит 100 долларов, а ваша заработная плата превышает 50 долларов в час, вы просто платите за него. Эти хлопоты отнимут у вас больше времени, чем 2 часа.
Fabio Ceconello

7
В частности, в среде, где Windows устанавливается путем клонирования главного образа машины, MachineGuid будет одинаковым для всех из них.
nandhp

8
Нет, если вы делаете это правильно и законно, используя sysprep & all. Для тех, у кого есть пиратские копии виндовс и "просто клон", это другое дело. Но в любом случае их так легко не остановить.
Фабио Чеконелло, 09

34

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

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

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

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


1
Как вы определяете, какой MAC-адрес используете? На машине может быть несколько сетевых адаптеров, и они добавляются динамически (при подключении к новой VPN через апплет добавляется виртуальный сетевой адаптер). Некоторые из них являются виртуальными, имеют тип Ethernet и их сложно идентифицировать как виртуальные. Остальные - вверх / вниз в зависимости от условий сети (Wi-Fi)
Марек

Мы используем все физические сетевые адаптеры - за исключением виртуальных сетевых адаптеров, синего зуба и т. Д. Все они объединены для создания единого хэша.
Paul Alexander

Почему вы рекомендуете не использовать серийный номер процессора?
Mojtaba Rezaeian

3
Серийный номер процессора не использовался в микросхеме Intel в течение многих лет. Системные вызовы все еще существуют, но не возвращают стабильного значения. Я не могу вспомнить, что он возвращает - фиктивные данные или одно и то же значение для всех машин. в любом случае это ненадежный аппаратный показатель.
Пол Александр

1
@PaulAlexander: инструмент, о котором вы упомянули, проверяет все параметры, которые вы упомянули, или некоторые из них будут работать? Потому что системы в наши дни обычно не состоят из компакт-дисков
Файзан Хусейн Раббани

3

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


14
Разве в наши дни это не изношенная собственность?
Джейк Уилсон

15
Возможно, он имеет в виду «устаревший» ... Производители процессоров начали вводить уникальные идентификаторы на одном этапе, но из-за негативной реакции на вопросы конфиденциальности они снова остановились. Таким образом, вы обнаружите, что некоторые из них имеют уникальный идентификатор, а большинство современных процессоров - нет.
TripleAntigen

1
Для справки: только небольшая партия Pentium III когда-либо имела серийные номера ЦП, которые можно было прочитать. В более поздних версиях был серийный номер, по умолчанию он был отключен. Pentium IV и более поздние процессоры просто не поддерживали его.
Пол Александр

2

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

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

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

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


5
MAC-адреса не будут работать, если на машине нет сетевой карты.
Брайан

7
@Brian - вам действительно нужно уникальное значение для идентификации компьютера, на котором нет сетевой карты? Кажется, можно с уверенностью сказать, что у машины есть карта.
романды

1

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


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

Это верная идея во многих случаях, вопрос не указывает на возможность спуфинга или офлайн - вам обычно нужно сгенерировать уникальный идентификатор, если вы хотите идентифицировать в сети
Hurda 01

На одном компьютере может быть несколько сетевых устройств; вам не гарантируется, что они всегда будут обнаруживаться в одном и том же порядке или что они не будут заменены в какой-то момент. Лучше использовать какое-то оборудование, которое, вероятно, будет более постоянным.
Agi

1

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

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

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


1

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

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


1

2
Это коммерческая библиотека с закрытым исходным кодом.
Gab

@ Gab-Исходный код доступен. А цена DLL (29) ничто по сравнению с другими библиотеками, которые даже близки к 2000 долларам. Так что да, это работает.
InTheNameOfScience

0

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


14
Mac-адрес можно подделать
Генри Би,

Это верная идея во многих случаях, вопрос не указывает на возможность спуфинга или офлайн - обычно вы хотите сгенерировать уникальный идентификатор, если хотите идентифицировать в сети
Hurda 01

0

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


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

1
MAC абсолютно ненадежен, потому что его можно так легко изменить (просто выполните поиск в Google, и вы увидите множество бесплатных инструментов, которые делают это). То же и для WMI.
InTheNameOfScience

0

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

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


0

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

-1

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.