Generieren einer eindeutigen Maschinen-ID

104

Ich muss eine Funktion schreiben, die eine ID generiert, die für einen bestimmten Computer mit einem Windows-Betriebssystem eindeutig ist.

Derzeit verwende ich WMI, um verschiedene Hardwareparameter abzufragen, sie zu verketten und sie zu hashen, um die eindeutige ID abzuleiten. Meine Frage ist, welche vorgeschlagenen Parameter sollte ich verwenden? Derzeit verwende ich eine Kombination aus BIOS \ CPU \ Datenträgerdaten, um die eindeutige ID zu generieren. Und ich verwende das erste Ergebnis, wenn für jede Metrik mehrere Ergebnisse vorhanden sind.

Ich bin jedoch auf ein Problem gestoßen, bei dem ein Computer, der zwei verschiedene Windows-Betriebssysteme doppelt startet, auf jedem Betriebssystem unterschiedliche Site-Codes generiert, was im Idealfall nicht der Fall sein sollte.

Als Referenz sind dies die Metriken, die ich derzeit verwende:

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
HS.
quelle

Antworten:

25

Analysieren Sie das SMBIOS selbst und hacken Sie es auf eine beliebige Länge. In der PDF-Spezifikation finden Sie alle verfügbaren SMBIOS-Strukturen.

Zur Abfrage des SMBIOS Infos von Windows kann Sie verwenden EnumSystemFirmwareEntries, EnumSystemFirmwareTablesund GetSystemFirmwareTable.

IIRC, die "eindeutige ID" aus dem CPUID-Befehl ist von P3 und neuer veraltet.

Jonas Gulle
quelle
14
Beachten Sie, dass für diese Funktionen mindestens Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 oder Windows Server 2003 mit SP1 erforderlich sind.
Jcoffland
33
Ein Hinweis, nicht das zu tun, was ich getan habe, nämlich GetSystemFirmwareTable ('RSMB' ...) aufzurufen; und hasht den gesamten SMBIOSTableData-Puffer. Es funktionierte großartig, bis ich auf eine Workstation stieß, die ihre CPU-Innentemperatur in diese Tabelle schrieb, was bedeutete, dass sich meine eindeutige ID alle paar Sekunden änderte.
Thomas
Gibt es einen Quellcode für diese Lösung?
Nur Schatten
@Thomas also welche lösung hast du endlich gewählt?
Smith
@ Smith Mein Ziel war eine kleine 8-stellige ID. Als ich die Spezifikation las, traf ich Entscheidungen darüber, welche Felder variieren könnten, und schloss sie aus. Dann habe ich über viele Jahre hinweg mehr Felder herausgeschnitten, die keine Konstanten von Maschinen sind. Schließlich habe ich eine verschlüsselte Kopie der Rohdaten gespeichert, die ich als Eingabe verwendet habe, und eine closeEnoughFunktion erstellt, damit ich eine nicht übereinstimmende ID akzeptiere, wenn sie nur in zwei Feldern variiert. Ich füge auch Details zum Prozessor und zur Systemfestplatte in meinen Hash ein, da ich schon früh Kollisionen zwischen identischen Systemen hatte.
Thomas
72

Ich hatte das gleiche Problem und nach ein wenig Recherche entschied ich, dass es am besten wäre, den MachineGuidRegistrierungsschlüssel einzulesen HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, wie @Agnus vorschlug. Es wird während der Installation des Betriebssystems generiert und ändert sich nur, wenn Sie ein neues Betriebssystem installieren. Abhängig von der Betriebssystemversion enthält es möglicherweise die eingebettete MAC-Adresse des Netzwerkadapters (plus einige andere Zahlen, einschließlich Zufallszahlen) oder eine Pseudozufallszahl, die später für neuere Betriebssystemversionen gilt (nach XP SP2, glaube ich, aber nicht sicher). Wenn es sich theoretisch um ein Pseudozufall handelt, kann es gefälscht werden - wenn zwei Maschinen denselben Ausgangszustand haben, einschließlich der Echtzeituhr. In der Praxis ist dies selten, aber seien Sie sich bewusst, wenn Sie erwarten, dass es sich um eine Sicherheitsbasis handelt, die von Hardcore-Hackern angegriffen werden kann.

Natürlich kann ein Registrierungseintrag auch von jedem leicht geändert werden, um eine Computer-GUID zu fälschen, aber ich habe festgestellt, dass dies den normalen Betrieb so vieler Windows-Komponenten stören würde, dass dies in den meisten Fällen kein normaler Benutzer tun würde (wieder aufpassen) für Hardcore-Hacker).

Fabio Ceconello
quelle
6
Sie können das KEY_WOW64_64KEY-Flag verwenden, um sicherzustellen, dass Sie immer die "echte" Version des Registrierungsschlüssels erhalten, denke ich.
Colen
13
Wenn Sie ein Laufwerk-Image klonen, bleibt dieses unverändert. Das ist also überhaupt nicht manipulationssicher und sehr unsicher.
Bitbonk
19
Um den Punkt zu verdeutlichen, ist es mein Hauptziel, wenn ich DRM-Maßnahmen in Software einsetze, zu verhindern, dass Menschen einen Riss erzeugen, der es "professionellen" Piraten ermöglicht, illegale Kopien der Software ohne Einschränkung zu verkaufen. Ich mache mir keine Sorgen um einen gelegentlichen Hacker, der das Laufwerk seines Freundes klont, nur um meine Software verwenden zu können. In solchen Fällen haben diese Leute normalerweise mehr Zeit als Geld und würden sowieso nicht dafür bezahlen. Wenn die Software 100 US-Dollar kostet und Ihr Lohn mehr als 50 US-Dollar pro Stunde beträgt, zahlen Sie nur dafür. Der Aufwand dauert länger als 2 Stunden.
Fabio Ceconello
7
Insbesondere in einer Umgebung, in der Windows durch Klonen eines Master-Computer-Images installiert wird, ist die MachineGuid für alle identisch.
Nandhp
8
Nicht, wenn Sie dies mit sysprep & all korrekt und legal tun. Für diejenigen, die Kopien von Fenstern raubkopiert und "nur geklont" haben, ist das eine andere Sache. Aber so einfach würden sie sowieso nicht aufgehalten werden.
Fabio Ceconello
34

Mit unserem Lizenzierungswerkzeug berücksichtigen wir die folgenden Komponenten

  • MAC-Adresse
  • CPU (Nicht die Seriennummer, sondern das tatsächliche CPU-Profil wie Schritt und Modell)
  • Seriennummer des Systemlaufwerks (kein Datenträgeretikett)
  • Erinnerung
  • CD-ROM Modell & Hersteller
  • Grafikkartenmodell & Anbieter
  • IDE-Controller
  • SCSI-Controller

Anstatt nur die Komponenten zu hashen und ein Pass / Fail-System zu erstellen, erstellen wir einen vergleichbaren Fingerabdruck , mit dem bestimmt werden kann, wie unterschiedlich zwei Maschinenprofile sind. Wenn die Differenzbewertung über einer festgelegten Toleranz liegt, bitten Sie den Benutzer, sie erneut zu aktivieren.

Wir haben in den letzten 8 Jahren bei der Verwendung mit Hunderttausenden von Endbenutzerinstallationen festgestellt, dass diese Kombination gut funktioniert, um eine zuverlässig eindeutige Maschinen-ID bereitzustellen - selbst für virtuelle Maschinen und geklonte Betriebssysteminstallationen.

Paul Alexander
quelle
1
Wie bestimmen Sie, welche MAC-Adresse Sie verwenden? Ein Computer kann mehrere Netzwerkkarten haben, die dynamisch hinzugefügt werden (durch Herstellen einer Verbindung zu einem neuen VPN über ein Applet wird eine virtuelle Netzwerkkarte hinzugefügt). Einige sind virtuell, haben Typ Ethernet und sind schwer als virtuell zu identifizieren. Andere sind Up / Down abhängig von den Netzwerkbedingungen (WiFi)
Marek
Wir verwenden alle physischen Netzwerkkarten - mit Ausnahme von virtuellen Netzwerkkarten, Bluetooth usw. -. Alle werden kombiniert, um einen einheitlichen Hash zu erstellen.
Paul Alexander
Warum empfehlen Sie, keine CPU-Seriennummer zu verwenden?
Mojtaba Rezaeian
3
Die Seriennummer der CPU wurde in einem Intel-Chip seit Jahren nicht mehr aktiviert. Die Systemaufrufe sind noch vorhanden, geben jedoch keinen stabilen Wert zurück. Ich kann mich nicht erinnern, was es zurückgibt - entweder Dummy-Daten oder der gleiche Wert für alle Maschinen. In beiden Fällen handelt es sich nicht um eine zuverlässige Hardwaremetrik.
Paul Alexander
1
@PaulAlexander Das Tool, auf das Sie verwiesen haben, überprüft alle von Ihnen genannten Parameter, oder funktionieren nur wenige davon? Weil Systeme heutzutage normalerweise nicht mehr aus einer CD-ROM bestehen
FaizanHussainRabbani
3

Was ist mit der UniqueID des Prozessors?

Gizmo
quelle
14
Ist das heutzutage nicht eine abgeschriebene Immobilie?
Jake Wilson
15
Vielleicht meint er "veraltet" ... CPU-Hersteller haben irgendwann damit begonnen, eindeutige IDs einzugeben, aber aufgrund von Rückschlägen in Datenschutzfragen haben sie erneut aufgehört. Sie werden also feststellen, dass einige eine eindeutige ID haben, die meisten modernen CPUs jedoch nicht.
TripleAntigen
1
Als Referenz hatte nur eine kurze Charge von Pentium III jemals CPU-Seriennummern, die gelesen werden konnten. Während spätere Versionen eine Seriennummer hatten, war diese standardmäßig deaktiviert. Pentium IV und spätere CPUs haben es einfach überhaupt nicht unterstützt.
Paul Alexander
2

Ich hasse es, der Typ zu sein, der sagt: "Du machst es einfach falsch" (ich hasse diesen Typ immer;), aber ...

Muss es für die einzigartige Maschine wiederholt generiert werden? Könnten Sie einfach die Kennung zuweisen oder einen öffentlichen / privaten Schlüssel eingeben? Wenn Sie den Wert generieren und speichern könnten, könnten Sie möglicherweise von beiden Betriebssysteminstallationen auf derselben Festplatte darauf zugreifen?

Sie haben diese Optionen wahrscheinlich untersucht und sie funktionieren nicht für Sie, aber wenn nicht, sollten Sie dies berücksichtigen.

Wenn es nicht um das Vertrauen der Benutzer geht, können Sie einfach MAC-Adressen verwenden.

Jonathan Adelson
quelle
5
MAC-Adressen funktionieren nicht, wenn das Gerät keine Netzwerkkarte hat.
Brian
7
@Brian - Benötigen Sie wirklich einen eindeutigen Wert, um einen Computer ohne Netzwerkkarte zu identifizieren? Scheint eine ziemlich sichere Wette zu sein, dass die Maschine eine Karte hat.
Romandas
1

Sie sollten die Verwendung der MAC-Adresse auf der Netzwerkkarte (falls vorhanden) prüfen. Diese sind normalerweise einzigartig, können aber hergestellt werden. Ich habe Software verwendet, die ihre Lizenzdatei basierend auf der MAC-Adresse Ihres Netzwerkadapters generiert. Daher wird dies als ziemlich zuverlässige Methode zur Unterscheidung zwischen Computern angesehen.

Kyle Cronin
quelle
6
Nein, das sind sie nicht. Viele Hersteller erlauben es Ihnen, sie zu ändern. Dies ist sehr hilfreich, wenn Sie mit Clustern arbeiten, da einige Anbieter Ihnen alle Computer mit derselben MAC-Adresse zur Verfügung stellen (wir sind vor einigen Jahren auf dieses Problem gestoßen).
Gizmo
Dies ist in vielen Fällen eine gültige Idee. Die Frage gibt keine Spoof-Proodness oder Offline an - Sie möchten im Allgemeinen eine eindeutige ID generieren, wenn Sie sich in einem Netzwerk identifizieren möchten
Hurda
Es ist möglich, mehrere Netzwerkgeräte auf demselben Computer zu haben. Es ist nicht garantiert, dass sie immer in derselben Reihenfolge erkannt werden oder dass sie irgendwann nicht mehr ersetzt werden. Es ist besser, Hardware zu verwenden, die wahrscheinlich dauerhafter ist.
Agi Hammerthief
1

Für eine meiner Anwendungen verwende ich entweder den Computernamen, wenn es sich nicht um einen Domänencomputer handelt, oder die SID des Domänencomputerkontos für Domänencomputer. Mark Russinovich spricht darüber in diesem Blog-Beitrag, Machine SID :

Der letzte Fall, in dem die SID-Duplizierung ein Problem darstellen würde, besteht darin, dass eine verteilte Anwendung Computer-SIDs verwendet, um Computer eindeutig zu identifizieren. Keine Microsoft-Software tut dies, und die Verwendung der Maschinen-SID auf diese Weise funktioniert nicht nur, weil alle Domänencontroller dieselbe Maschinen-SID haben. Software, die auf eindeutigen Computeridentitäten basiert, verwendet entweder Computernamen oder Computerdomänen-SIDs (die SID der Computerkonten in der Domäne).

Sie können über LDAP oder auf die SID des Domänencomputerkontos zugreifen System.DirectoryServices.

cmcginty
quelle
1

In meinem Programm suche ich zuerst nach Terminal Server und verwende die WTSClientHardwareId. Andernfalls sollte die MAC-Adresse des lokalen PCs ausreichend sein.

Wenn Sie wirklich die Liste der Eigenschaften verwenden möchten , vorausgesetzt , Sie verlassen out Dinge wie Nameund DriverVersion, Clockspeedusw. , da es möglicherweise ist abhängig vom Betriebssystem. Versuchen Sie, auf beiden Betriebssystemen die gleichen Informationen auszugeben, und lassen Sie die Unterschiede aus.

AngelBlaZe
quelle
1

Für den Abruf hardwarespezifischer Informationen steht eine Bibliothek zur Verfügung: Hardware-Seriennummern-Extraktor (CPU, RAM, HDD, BIOS)

Ariwez
quelle
2
Es ist eine geschlossene kommerzielle Handelsbibliothek.
Gab
@ Gab-Der Quellcode ist verfügbar. Und der Preis für die DLL (29) ist nichts im Vergleich zu anderen Bibliotheken, die sogar nahe an 2000 US-Dollar liegen. Also ja, es macht den Job.
InTheNameOfScience
0

Warum nicht die MAC-Adresse Ihrer Netzwerkkarte verwenden?

Brian Matthews
quelle
14
Mac-Adresse kann gefälscht werden
Henry B
Dies ist in vielen Fällen eine gültige Idee. Die Frage gibt keine Spoof-Proodness oder Offline an - Sie möchten im Allgemeinen eine eindeutige ID generieren, wenn Sie sich in einem Netzwerk identifizieren möchten
Hurda
0

Vielleicht ein bisschen schummeln, aber die MAC-Adresse eines Ethernet-Adapters eines Computers ändert sich selten, ohne dass sich das Motherboard heutzutage ändert.

bfabry
quelle
Viele Hersteller erlauben es Ihnen, sie zu ändern. Dies ist sehr hilfreich, wenn Sie mit Clustern arbeiten, da einige Anbieter Ihnen alle Computer mit derselben MAC-Adresse zur Verfügung stellen (wir sind vor einigen Jahren auf dieses Problem gestoßen).
Gizmo
1
MAC ist völlig unzuverlässig, weil es so einfach geändert werden kann (nur zu einer Google-Suche und Sie werden viele kostenlose Tools sehen, die dies tun). Gleiches gilt für WMI.
InTheNameOfScience
0

Können Sie eine Seriennummer oder ein Service-Tag des Herstellers ziehen?

Unser Shop ist ein Dell-Shop, daher verwenden wir das Service-Tag, das für jeden Computer eindeutig ist, um sie zu identifizieren. Ich weiß, dass es zumindest unter Linux aus dem BIOS abgefragt werden kann, aber ich weiß nicht ohne weiteres, wie es unter Windows geht.

Christopher Cashell
quelle
0

Ich hatte eine zusätzliche Einschränkung: Ich habe .net Express verwendet, sodass ich den Standard-Hardware-Abfragemechanismus nicht verwenden konnte. Also entschied ich mich, Power Shell zu verwenden, um die Abfrage durchzuführen. Der vollständige Code sieht folgendermaßen aus:

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
user2515235
quelle
-1

Suchen Sie nach der CPUID für eine Option. Bei Systemen mit mehreren CPUs können Probleme auftreten.

BCS
quelle