web-dev-qa-db-de.com

Generieren einer eindeutigen Rechner-ID

Ich muss eine Funktion schreiben, die eine ID generiert, die für einen bestimmten Computer, auf dem ein Windows-Betriebssystem ausgeführt wird, eindeutig ist.

Derzeit verwende ich WMI, um verschiedene Hardware-Parameter abzufragen, sie miteinander zu verketten und sie zu hashieren, um die eindeutige ID abzuleiten. Meine Frage lautet: Welche Parameter sollten ich verwenden? Derzeit verwende ich eine Kombination aus Bios\cpu\Festplattendaten, 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 eine Maschine, die zwei verschiedene Windows-Betriebssysteme bootet, unterschiedliche Standortcodes für jedes Betriebssystem generiert, was im Idealfall nicht passieren sollte.

Dies sind 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
97
HS.

Parsen Sie das SMBIOS selbst und häkeln Sie es in beliebiger Länge. In der Spezifikation PDF finden Sie alle verfügbaren SMBIOS-Strukturen.

Um die SMBIOS-Informationen von Windows abzufragen, können Sie EnumSystemFirmwareEntries , EnumSystemFirmwareTables und GetSystemFirmwareTable verwenden.

Bei IIRC wird die "eindeutige ID" aus der CPUID-Anweisung von P3 und neuer abgelehnt.

22
Jonas Gulle

Ich hatte das gleiche Problem und nach ein wenig Recherche entschied ich, dass das Beste wäre, MachineGuid im Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography zu lesen, wie @Agnus vorschlug. Es wird während der Installation des Betriebssystems generiert und ändert sich nicht, es sei denn, Sie führen eine neue Betriebssysteminstallation durch. Je nach Betriebssystemversion kann es die eingebettete MAC-Adresse des Netzwerkadapters (sowie einige andere Zahlen, einschließlich Zufallszahlen) oder eine Pseudo-Zufallszahl enthalten, die später für neuere Betriebssystemversionen (nach XP SP2, glaube ich, aber nicht sicher). Wenn es ein Pseudo-Zufall ist, kann es theoretisch gefälscht werden - wenn zwei Maschinen den gleichen Ausgangszustand haben, einschließlich Echtzeituhr. In der Praxis wird dies selten sein. Seien Sie sich jedoch bewusst, wenn Sie davon ausgehen, dass es eine Sicherheitsbasis ist, die von Hardcore-Hackern angegriffen werden kann.

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

71
Fabio Ceconello

Mit unserem Lizenzierungswerkzeug betrachten wir die folgenden Komponenten

  • MAC-Adresse
  • CPU (nicht die Seriennummer, sondern das tatsächliche CPU-Profil wie Schritt und Modell)
  • Seriennummer des Systemlaufwerks (nicht Datenträgerbezeichnung)
  • Erinnerung
  • CD-ROM-Modell und Hersteller
  • Videokartenmodell und Anbieter
  • IDE-Controller
  • SCSI-Controller

Anstatt jedoch nur die Komponenten zu haschen 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 bestimmten Toleranz liegt, bitten Sie den Benutzer, ihn erneut zu aktivieren. 

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

30
Paul Alexander

Wie wär's mit der UniqueID des Prozessors?

2
gizmo

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

Muss es für die einzigartige Maschine wiederholt generiert werden? Könnten Sie einfach die Kennung vergeben oder einen öffentlichen/privaten Schlüssel verwenden? Wenn Sie den Wert generieren und speichern könnten, könnten Sie möglicherweise von beiden Betriebssysteminstallationen auf denselben Datenträger darauf zugreifen.

Sie haben wahrscheinlich diese Optionen ausprobiert und sie funktionieren nicht für Sie, aber wenn nicht, sollten Sie dies bedenken.

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

2
Sam Hoice

In meinem Programm überprüfe ich zuerst nach Terminalserver und verwende die WTSClientHardwareId. Andernfalls sollte die MAC-Adresse des lokalen PCs ausreichend sein.

Wenn Sie die von Ihnen bereitgestellte Liste der Eigenschaften wirklich verwenden möchten, lassen Sie Dinge wie Name und DriverVersion, Clockspeed usw. weg, da diese möglicherweise vom Betriebssystem abhängen. Versuchen Sie, die gleichen Informationen auf beiden Betriebssystemen auszugeben, und lassen Sie die Unterschiede zwischen den beiden Betriebssystemen weg.

1
AngelBlaZe

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

1
Kyle Cronin

Es gibt eine Bibliothek zum Abrufen hardwarespezifischer Informationen: Hardware-Seriennummern-Extraktor (CPU, RAM, HDD, BIOS)

1
ariwez

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 in diesem Blogbeitrag darüber, Machine SID :

Der letzte Fall, bei dem die SID-Duplizierung ein Problem darstellt, ist, wenn eine verteilte Anwendung SIDs des Computers verwendet, um Computer eindeutig zu identifizieren. Keine Microsoft-Software macht dies und die Verwendung der Maschinen-SID auf diese Weise funktioniert nicht nur für die Tatsache, dass alle Domänencontroller dieselbe Maschinen-SID haben. Software, die auf eindeutige Computeridentitäten angewiesen ist, verwendet entweder Computernamen oder Computer-Domänen-SIDs (die SID der Computerkonten in der Domäne). 

Sie können auf die Domänencomputer-Konto-SID über LDAP oder System.DirectoryServices zugreifen.

1
cmcginty

Warum verwenden Sie nicht die MAC-Adresse Ihrer Netzwerkkarte?

0
Brian Matthews

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

0
bfabry

Können Sie eine Art Herstellerseriennummer oder ein Service-Tag ziehen?

Unser Shop ist ein Dell-Shop. Daher verwenden wir das Service-Tag, das für jede Maschine eindeutig ist, um sie zu identifizieren. Ich weiß, dass es vom BIOS abgefragt werden kann, zumindest in Linux, aber ich weiß nicht, wie es in Windows geht.

0

Ich hatte eine zusätzliche Einschränkung, ich verwendete .net express, sodass ich den Standard-Hardware-Abfrage-Mechanismus nicht verwenden konnte. Also entschied ich mich für die Abfrage mit Power Shell. 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
0
user2515235