Створення унікального ідентифікатора машини


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, яке рішення ви нарешті обрали?
Сміт

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

72

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

Звичайно, запис реєстру також може легко змінити будь-хто, щоб підробити машинний GUID, але я виявив, що це порушить нормальну роботу стільки компонентів Windows, що в більшості випадків жоден звичайний користувач цього не зробить (знову ж, будьте уважні для хардкорних хакерів).


6
Ви можете використовувати прапор KEY_WOW64_64KEY, щоб переконатися, що ви завжди отримуєте "справжню" версію ключа реєстру, я думаю.
Колен

13
Якщо ви клонуєте зображення диска, це буде незмінним. Тож це зовсім не безпечно і дуже незахищено.
bitbonk

19
Для уточнення моменту, коли я вкладаю заходи DRM в програмне забезпечення, моя головна мета - запобігти людям створювати тріщини, що дозволяють «професійним» піратам продавати незаконні копії програмного забезпечення без будь-яких обмежень. Мене не так турбує випадковий хакер, який клонує диск свого друга, щоб мати можливість використовувати моє програмне забезпечення. У таких випадках у цих людей зазвичай більше часу, ніж грошей, і ні в якому разі не платять за це. Якщо програмне забезпечення коштує 100 доларів, а ваша заробітна плата перевищує 50 доларів / год, ви просто платите за це. Проблеми займуть більше часу, ніж 2 години.
Фабіо Чеконелло

7
Зокрема, у середовищі, де Windows встановлюється шляхом клонування головного зображення машини, MachineGuid буде однаковим для всіх.
нандхп

8
Не, якщо ви робите це правильно та законно, використовуючи sysprep & all. Для тих, хто має піратські копії вікон та "просто клонують", це інша справа. Але все одно їх би не зупинили так легко.
Фабіо Чеконелло

34

За допомогою нашого інструменту ліцензування ми враховуємо наступні компоненти

  • MAC-адреса
  • ЦП (не серійний номер, а власне профіль процесора, наприклад, крок та модель)
  • Серійний номер системного накопичувача (не мітка гучності)
  • Пам'ять
  • Модель CD-ROM та постачальник
  • Модель та постачальник відеокарт
  • Контролер IDE
  • Контролер SCSI

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

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


1
Як визначити, яку MAC-адресу ви використовуєте? Машина може мати кілька NIC, і вони додаються динамічно (підключення до нового VPN через аплет додасть віртуальний NIC). Деякі віртуальні, мають тип Ethernet і їх важко ідентифікувати як віртуальні. Інші - вгору / вниз залежно від умов мережі (wifi)
Марек,

Ми використовуємо всі фізичні NIC - за винятком віртуальних NICS, синіх зубів тощо. Всі вони поєднуються для створення уніфікованого хешу.
Пол Олександр

Чому ви рекомендуєте не використовувати серійний номер процесора?
Мойтаба Резайан

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

1
@PaulAlexander інструмент, про який ви посилалися, перевіряє всі параметри, згадані вами, або декілька з них спрацює? Оскільки системи зараз добу зазвичай не складаються з компакт-дисків
FaizanHussainRabbani

3

Що з просто використанням UniqueID процесора?


14
Хіба це не знецінене майно в ці дні?
Джейк Вілсон

15
Можливо, він означає «застарілий» ... Виробники процесорів почали вводити унікальні ідентифікатори на одній стадії, але через люфт над питаннями конфіденційності вони знову зупинилися. Тож ви побачите, що деякі мають унікальний ідентифікатор, але більшість сучасних процесорів цього не мають.
TripleAntigen

1
Для довідки, лише коротка партія Pentium III колись мала серійні номери процесора, які можна було прочитати. Хоча пізніші версії мали серійний номер, він був відключений за замовчуванням. Pentium IV та новіші процесори просто зовсім не підтримували його.
Павло Олександр

2

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

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

Ви, напевно, вивчили ці варіанти, і вони не працюють для вас, але якщо ні, то варто щось врахувати.

Якщо це не питання довіри користувачів, ви можете просто використовувати MAC адреси.


5
MAC-адреси не працюватимуть, якщо на пристрої немає мережевої карти.
Брайан

7
@Brian - чи справді вам потрібна унікальна цінність для ідентифікації комп'ютера, який не має мережевої карти? Здається, досить безпечна ставка, що машина має картку.
romandas

1

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


6
Ні, вони ні. Багато виробників дозволяє вам їх змінити. Це дуже корисно при роботі з кластерами, оскільки деякі постачальники надають вам весь комп'ютер з однаковою MAC-адресою (ми стикалися з цим питанням кілька років тому).
gizmo

Ця ідея є дійсною у багатьох випадках, питання не вказує на шахрайство або офлайн - ви, як правило, бажаєте генерувати унікальний ідентифікатор, якщо хочете ідентифікувати в мережі
Hurda

Можливо, що в одній машині є кілька мережевих пристроїв; Ви не гарантуєте, що вони завжди будуть виявлені в одному порядку або що вони не будуть замінені в якийсь момент. Краще використовувати деяке обладнання, яке, ймовірно, буде більш постійним.
Agi Hammerthief

1

Для однієї з моїх програм я використовую або ім’я комп'ютера, якщо це недоменний комп'ютер, або SID облікового запису доменної машини для доменних комп'ютерів. Марк Русинович розповідає про це в цій публікації в блозі, Machine SID :

Останній випадок, коли дублювання SID було б проблемою, якщо розподілене додаток використовувало машинні SID для унікальної ідентифікації комп'ютерів. Жодне програмне забезпечення Майкрософт не робить цього, і таким чином використання SID машини не працює лише тому, що всі DC мають однакову машину SID. Програмне забезпечення, що спирається на унікальну ідентичність комп'ютера, або використовує імена комп'ютера, або комп'ютерні домени SID (SID облікових записів комп'ютера в домені).

Ви можете отримати доступ до облікового запису машинного домену SID через LDAP або System.DirectoryServices.


1

У своїй програмі я спочатку перевіряю термінальний сервер і використовую WTSClientHardwareId. Інакше MAC-адреса місцевого ПК повинна бути адекватною.

Якщо ви дійсно хочете використовувати список властивостей , при умови відпустки з таких речей , як Nameі DriverVersion, Clockspeedі т.д. , так як це , можливо , залежні від ОС. Спробуйте вивести однакову інформацію в обох операційних системах і залишити ту, що відрізняється між собою.


1

2
Це комерційна бібліотека із закритим джерелом.
Габ

@ Gab-вихідний код доступний. А ціна DLL (29) - це ніщо в порівнянні з іншими бібліотеками, які навіть близькі до 2000 доларів. Отже, так, це робить свою роботу.
InTheNameOfScience

0

Чому б не використовувати MAC-адресу вашої мережевої карти?


14
Адреса Mac може бути підробленою
Генрі Б

Ця ідея є дійсною у багатьох випадках, питання не вказує на шахрайство або офлайн - ви, як правило, бажаєте генерувати унікальний ідентифікатор, якщо хочете ідентифікувати в мережі
Hurda

0

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


Багато виробників дозволяє вам їх змінити. Це дуже корисно при роботі з кластерами, оскільки деякі постачальники надають вам весь комп'ютер з однаковою MAC-адресою (ми стикалися з цим питанням кілька років тому).
gizmo

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.