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

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

person HS.    schedule 19.09.2008    source источник


Ответы (15)


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

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

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

person Jonas Engström    schedule 22.09.2008
comment
Обратите внимание, что для этих функций требуется как минимум Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 или Windows Server 2003 с пакетом обновления 1 (SP1). - person jcoffland; 21.03.2011
comment
Замечание, что нельзя делать то, что я сделал, а именно вызвать GetSystemFirmwareTable ('RSMB' ...); и хэширует весь буфер SMBIOSTableData. Он работал отлично, пока я не наткнулся на рабочую станцию, которая записала в эту таблицу внутреннюю температуру процессора, что означает, что мой уникальный идентификатор менялся каждые несколько секунд. - person Thomas; 05.01.2012
comment
Есть ли исходный код для этого решения? - person Just Shadow; 12.02.2018
comment
@ Томас, а какое решение вы в конце концов выбрали? - person Smith; 09.10.2018
comment
@Smith Моей целью был маленький 8-значный идентификатор. Читая спецификацию, я решил, какие поля могут отличаться, и исключил их. Затем, в течение многих лет, я вырезал из машин больше полей, которые не являются постоянными. Наконец, я закончил тем, что сохранил зашифрованную копию необработанных данных, которые я использовал в качестве входных, и создал функцию closeEnough, чтобы я принимал несовпадающий идентификатор, если он изменялся только в 2-х полях. Я также включаю в свой хэш сведения о процессоре и системном жестком диске, потому что на раннем этапе у меня были конфликты между идентичными системами. - person Thomas; 09.10.2018
comment
@ Томас, что это за система. Странно, что он записал в эту таблицу температуру процессора. - person Konrad; 26.07.2019
comment
@Konrad К сожалению, я точно не знаю. Глядя на некоторые электронные письма того времени, я полагаю, что это был набор настольных станций Dell, которые мы собрали вместе как набор обрабатывающих ферм. Возможно, это была ошибка. Я видел много переменных за эти годы. Крышки ноутбука открыты / закрыты, подключен Wi-Fi и т. Д. - person Thomas; 29.07.2019

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

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

person Fabio Ceconello    schedule 04.05.2009
comment
Возможно ли это? Я имею в виду, что одного этого ключа достаточно для надежной системы лицензирования ?? - person Jey Geethan; 29.07.2009
comment
Нисколько. В моем случае, например, я использую его только для целей аудита. К сожалению, на обычных ПК нет надежной инфраструктуры DRM. Как вы упомянули, надежная система лицензирования должна использовать внешние (USB-ключи) или нестандартные (CPUID) источники для уникального номера. - person Fabio Ceconello; 06.08.2009
comment
Основная проблема с HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography заключается в том, что, принимая во внимание виртуализацию реестра (узел VirtualStore) + перенаправление процесса Wow64 реестра (узел wow6432node), трудно всегда получать одно и то же значение в зависимости от процесса хостинга? - person Patrick from NDepend team; 16.11.2010
comment
Я думаю, вы можете использовать флаг KEY_WOW64_64KEY, чтобы убедиться, что вы всегда получаете настоящую версию ключа реестра. - person Colen; 09.06.2011
comment
Если вы клонируете образ диска, он останется прежним. Так что это совсем небезопасно и очень небезопасно. - person bitbonk; 08.07.2011
comment
Как и в случае со всеми другими мерами DRM, за его нарушение есть своя цена. Бывает, что цена на это значительно ниже, чем, скажем, USB-ключ. Защита будет эффективной, если такая цена (или совокупная цена нескольких используемых мер) выше, чем цена, которую вы продаете за программное обеспечение. Да, есть хакеры, которые сломают его несмотря ни на что, просто для удовольствия. Но вам следует беспокоиться не об этом. - person Fabio Ceconello; 08.07.2011
comment
Чтобы прояснить суть дела, когда я использую меры DRM в программном обеспечении, моя главная цель - не дать людям создать взлом, который позволяет «профессиональным» пиратам без каких-либо ограничений продавать нелегальные копии программного обеспечения. Меня не особо беспокоит случайный хакер, который клонирует диск своего друга только для того, чтобы использовать мое программное обеспечение. В таких случаях у этих людей обычно больше времени, чем денег, и они все равно не будут за это платить. Если программное обеспечение стоит 100 долларов, а ваша заработная плата превышает 50 долларов в час, вы просто платите за него. Эти хлопоты отнимут у вас больше времени, чем 2 часа. - person Fabio Ceconello; 17.07.2011
comment
В частности, в среде, где Windows устанавливается путем клонирования главного образа машины, MachineGuid будет одинаковым для всех из них. - person nandhp; 10.02.2012
comment
Нет, если вы сделаете это правильно и законно, используя sysprep & all. Для тех, у кого есть пиратские копии виндовс и просто клонируют, это другое дело. Но все равно их так легко не остановить. - person Fabio Ceconello; 09.03.2012
comment
Я почти уверен, что на одном из компьютеров моих клиентов недавно был изменен идентификатор машины. Они не переустанавливали Windows, но заменили некоторые аппаратные компоненты, включая новую сетевую карту. Возможно ли это с помощью этого решения? - person angularsen; 14.06.2012
comment
@AndreasLarsen, который аннулирует его лицензию и потребует от него связаться с вами для выдачи новой. Со мной такое случается, но это такой простой и редкий случай, что людям поддержки нелегко справиться. Вас больше беспокоит обратное, две машины с одинаковым идентификатором. В моем случае это обнаружено, потому что программное обеспечение должно регулярно связываться с моим сервером. - person Fabio Ceconello; 01.05.2013
comment
Когда я пытался прочитать это значение ключа из C #, он всегда возвращал null, потому что мой проект создавался для x86. Решение проблемы здесь - stackoverflow.com/a/26699672/507950 - person dodgy_coder; 10.06.2015
comment
@FabioCeconello, это все еще лучшее для вас. - person AbderrahimDz24; 29.11.2016
comment
@ AbderrahimDz24 - упомянутый мною продукт больше не продается; также рынок немного изменился; в настоящее время я больше не полагаюсь на модель автономных лицензий. Вместо этого лучше связать лицензию с какой-либо учетной записью облачной службы (которую в большинстве случаев вы все равно захотите иметь, поскольку теперь трудно думать о отключенном приложении), и это будет служить мерой DRM. Конечно, пользователь может поделиться своим логином с кем-нибудь, но тогда все его данные тоже будут переданы. - person Fabio Ceconello; 29.11.2016

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

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

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

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

person Paul Alexander    schedule 07.03.2012
comment
Как вы определяете, какой MAC-адрес используете? На машине может быть несколько сетевых адаптеров, и они добавляются динамически (при подключении к новой VPN через апплет добавляется виртуальный сетевой адаптер). Некоторые из них являются виртуальными, имеют тип Ethernet и их сложно идентифицировать как виртуальные. Остальные - вверх / вниз в зависимости от условий сети (Wi-Fi). - person Marek; 19.09.2012
comment
Мы используем все физические сетевые адаптеры - за исключением виртуальных сетевых адаптеров, синего зуба и т. Д. Все они объединены для создания единого хэша. - person Paul Alexander; 20.09.2012
comment
Почему вы рекомендуете не использовать серийный номер процессора? - person Mojtaba Rezaeian; 15.04.2016
comment
Серийный номер процессора не использовался в микросхеме Intel в течение многих лет. Системные вызовы все еще существуют, но не возвращают стабильного значения. Я не могу вспомнить, что он возвращает - фиктивные данные или одно и то же значение для всех машин. в любом случае это ненадежный аппаратный показатель. - person Paul Alexander; 16.04.2016
comment
@PaulAlexander инструмент, о котором вы упомянули, проверяет все параметры, которые вы упомянули, или некоторые из них будут работать? Поскольку современные системы обычно не состоят из компакт-дисков - person FaizanHussainRabbani; 10.02.2017

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

person gizmo    schedule 19.09.2008
comment
Разве в наши дни это не изношенная собственность? - person Jake Wilson; 21.06.2010
comment
Возможно, он имеет в виду «устаревший» ... Производители процессоров начали вводить уникальные идентификаторы на одном этапе, но из-за негативной реакции на вопросы конфиденциальности они снова остановились. Таким образом, вы обнаружите, что некоторые из них имеют уникальный идентификатор, а большинство современных процессоров - нет. - person TripleAntigen; 29.08.2011
comment
Для справки: только небольшая партия Pentium III когда-либо имела серийные номера ЦП, которые можно было прочитать. Хотя в более поздних версиях был серийный номер, он был отключен по умолчанию. Pentium IV и более поздние процессоры просто его не поддерживали. - person Paul Alexander; 05.05.2012

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

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

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

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

person Jonathan Adelson    schedule 19.09.2008
comment
MAC-адреса не будут работать, если на машине нет сетевой карты. - person Brian; 20.01.2009
comment
@Brian - вам действительно нужно уникальное значение для идентификации компьютера, на котором нет сетевой карты? Кажется, можно с уверенностью сказать, что у машины есть карта. - person romandas; 21.03.2009
comment
Вы можете подделать и изменить свой MAC-адрес буквально за 2 минуты. - person Gaspa79; 16.12.2020

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

person Kyle Cronin    schedule 19.09.2008
comment
Нет, это не так. Многие производители разрешают их менять. Это очень полезно при работе с кластерами, потому что некоторые производители предоставляют вам все компьютеры с одним и тем же MAC-адресом (мы столкнулись с этой проблемой несколько лет назад). - person gizmo; 19.09.2008
comment
Это верная идея во многих случаях, вопрос не указывает на возможность подделки или офлайн - вы обычно хотите сгенерировать уникальный идентификатор, если хотите идентифицировать в сети. - person Hurda; 01.03.2012
comment
На одном компьютере может быть несколько сетевых устройств; вам не гарантируется, что они всегда будут обнаруживаться в одном и том же порядке или что они не будут заменены в какой-то момент. Лучше использовать какое-то оборудование, которое, вероятно, будет более постоянным. - person Agi Hammerthief; 08.03.2017

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

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

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

person cmcginty    schedule 31.03.2011

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

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

person AngelBlaZe    schedule 14.11.2008

Для получения информации об оборудовании доступна библиотека: Устройство для извлечения серийных номеров (ЦП, ОЗУ, жесткий диск, BIOS)

person ariwez    schedule 13.03.2014
comment
Это коммерческая библиотека с закрытым исходным кодом. - person Gab; 30.07.2014
comment
@ Gab-Исходный код доступен. А цена DLL (29) ничто по сравнению с другими библиотеками, которые даже близки к 2000 долларам. Так что да, он выполняет свою работу. - person Z80; 07.04.2015

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

person Brian Matthews    schedule 19.09.2008
comment
Mac-адрес можно подделать - person Henry B; 22.05.2009
comment
Это верная идея во многих случаях, вопрос не указывает на возможность подделки или офлайн - вы обычно хотите сгенерировать уникальный идентификатор, если хотите идентифицировать в сети. - person Hurda; 01.03.2012

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

person bfabry    schedule 19.09.2008
comment
Многие производители разрешают их менять. Это очень полезно при работе с кластерами, потому что некоторые производители предоставляют вам все компьютеры с одним и тем же MAC-адресом (мы столкнулись с этой проблемой несколько лет назад). - person gizmo; 19.09.2008
comment
MAC абсолютно ненадежен, потому что его можно так легко изменить (просто выполните поиск в Google, и вы увидите множество бесплатных инструментов, которые делают это). То же и для WMI. - person Z80; 07.04.2015

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

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

person Christopher Cashell    schedule 19.09.2008

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

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

person BCS    schedule 19.09.2008

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

person wahm sarab    schedule 27.06.2013