Frage

Ich brauche eine Funktion zu schreiben, die eine ID generiert, die für eine bestimmte Maschine läuft ein Windows-Betriebssystem einzigartig ist.

Derzeit bin ich WMI mit verschiedenen Hardware-Parameter abzufragen und verketten sie zusammen und Hash sie die eindeutige ID abzuleiten. Meine Frage ist, was sind die vorgeschlagenen Parameter sollte ich verwenden? Derzeit bin ich mit einer Kombination von BIOS \ CPU \ Plattendaten die eindeutige ID zu erzeugen. Und ist das erste Ergebnis zu verwenden, wenn mehr Ergebnisse gibt es für jede Metrik.

Aber ich lief in ein Problem, bei dem eine Maschine, die Dual-Stiefel in zwei verschiedenen Windows-Betriebssystem unterschiedliche Standortcodes auf jedem OS erzeugt, die idealerweise nicht passieren.

Als Referenz, das sind die Metriken ich zur Zeit mit:

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
War es hilfreich?

Lösung

Parsen der SMBIOS selbst und Hash es auf eine beliebige Länge. Sehen Sie sich die PDF-Spezifikation für alle SMBIOS Strukturen zur Verfügung.

die SMBIOS Informationen aus dem Windows abzufragen Sie EnumSystemFirmwareEntries , EnumSystemFirmwareTables und GetSystemFirmwareTable .

IIRC, die "unique ID" von der CPUID-Anweisung wird von P3 veraltet und neuer.

Andere Tipps

Ich hatte das gleiche Problem und nach einer wenig Recherche habe ich beschlossen, die beste MachineGuid in Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography zu lesen wäre, wie @Agnus vorgeschlagen. Es wird während der Installation des Betriebssystems erzeugt und wird sich nicht ändern, wenn Sie eine andere frische OS machen installieren. In Abhängigkeit von der OS-Version kann es die Netzwerkadapter MAC-Adresse enthält eingebettete (plus einige andere Zahlen, einschließlich random) oder einer Pseudo-Zufallszahl, die später für neuere Betriebssystem-Versionen (nach XP SP2, glaube ich, aber nicht sicher). Wenn es ein Pseudo-Zufall ist theoretisch kann es geschmiedet werden - wenn zwei Maschinen den gleichen Anfangszustand, einschließlich Echtzeit-Uhr. In der Praxis wird dies selten sein, aber beachten Sie, wenn Sie es erwarten, dass eine Basis für die Sicherheit sein, die von Hardcore-Hackern angegriffen werden können.

Natürlich ist ein Registrierungseintrag kann auch von jedermann leicht geändert werden, um eine Maschine GUID zu schmieden, aber was ich gefunden habe ist, dass diese die normalen Betrieb so viele Komponenten von Windows stören würden, dass in den meisten Fällen kein normaler Benutzer es wieder tun würde ( , sieht für Hardcore-Hacker).

Mit unserem Lizenzierung Tool betrachten wir die folgenden Komponenten

  • MAC-Adresse
  • CPU (nicht die Seriennummer, aber das tatsächliche CPU-Profil wie ein Schritt und Modell)
  • System Drive Seriennummer (Nicht Volume Label)
  • Speicher
  • CD-ROM-Modell und Anbieter
  • Video Card Modell & Verkäufer
  • IDE-Controller
  • SCSI-Controller

Doch nicht nur die Komponenten Hashing und ein Pass / Fail-System zu schaffen, schaffen wir eine comparable Fingerabdruck die verwendet werden können, um zu bestimmen, wie unterschiedlich zwei Maschinenprofile sind. Wenn die Differenz Bewertung über einer vorgegebene Toleranz ist dann bitten Sie den Benutzer wieder zu aktivieren.

Wir haben in den letzten 8 Jahren im Einsatz mit Hunderttausenden von End-User gefunden installiert, dass diese Kombination einer zuverlässigen einzigartige Maschine id gut zu schaffen, arbeitet -. Auch für virtuelle Maschinen und geklonte OS installiert

Ich hasse der Kerl zu sein, der sagt: „Sie sind es einfach falsch zu machen“ (ich immer diese Typen hassen;), aber ...

muss es wiederholbar für die einzigartige Maschine erzeugt werden? Könnten Sie die Kennung zuweisen oder einen öffentlichen / privaten Schlüssel tun? wenn Sie erzeugen könnten und den Wert, man könnte es vielleicht Zugriff sowohl von OS auf demselben Datenträger installiert?

Sie haben wahrscheinlich diese Optionen untersucht und sie für Sie nicht funktionieren, aber wenn nicht, es ist etwas zu prüfen.

Wenn es nicht eine Frage der das Vertrauen der Nutzer ist, können Sie nur MAC-Adressen verwenden.

Was ist nur die UniqueID des Prozessors mit?

Sie sollten die MAC-Adresse der Netzwerkkarte prüfen (falls vorhanden). Das ist in der Regel einzigartig, aber kann hergestellt werden. Ich habe Software verwendet, die basierend auf dem Netzwerkadapter MAC-Adresse seine Lizenzdatei erzeugt, so dass es eine ziemlich zuverlässige Art und Weise zwischen den Computern zu unterscheiden betrachtet.

Für eine der Anwendungen, ich entweder die Computernamen verwenden, wenn es nicht-Domäne-Computer, oder die Domäne Computerkonto SID für Domain-Computer. Mark Russinovich spricht darüber in diesem Blog-Post, Maschine SID

  

Der letzte Fall, in dem SID Vervielfältigung ein Problem wäre, wenn eine verteilte Anwendung verwendet Maschine SIDs eindeutig Computer identifizieren. Keine Microsoft-Software nicht so und mit Hilfe des Computer-SID auf diese Weise funktioniert nicht nur für die Tatsache, dass alle DCs den gleiche Maschine SID. Software, die auf einzigartige Computer Identitäten beruht entweder verwendet Computernamen oder Computer Domain SIDs (die SID der Computerkonten in der Domäne).

Sie können die Domain-Computer-Konto zugreifen SID über LDAP oder System.DirectoryServices.

In meinem Programm, das ich zuerst für Terminal Server überprüfen und die WTSClientHardwareId verwenden. Else die MAC-Adresse des lokalen PC ausreichend sein sollte.

Wenn Sie wirklich verwenden möchten die Liste der Eigenschaften, die Sie zur Verfügung gestellt auslassen Dinge wie Name und DriverVersion, Clockspeed usw., da es möglicherweise ist abhängig vom Betriebssystem. Versuchen Sie, die gleichen Informationen auf beiden Betriebssystemen ausgeben und auslassen, was unterscheidet zwischen.

Es gibt eine Bibliothek für immer Hardware-spezifische Informationen: Seriennummer der Hardware-Extraktor (CPU, RAM, HDD, BIOS)

Warum verwenden Sie die MAC-Adresse der Netzwerkkarte nicht?

Vielleicht ein wenig zu betrügen, aber die MAC-Adresse eines Maschinen-Ethernet-Adapter ändert sich selten ohne das Motherboard in diesen Tagen zu ändern.

Können Sie irgendeine Art von Hersteller-Seriennummer oder Service-Tag ziehen?

Unser Geschäft ist ein Dell-Shop, so verwenden wir den Service-Tag, die jede Maschine einzigartig ist, sie zu identifizieren. Ich weiß, es kann aus dem BIOS, zumindest in Linux abgefragt werden, aber ich weiß nicht ohne Weiteres, wie es in Windows zu tun.

Ich hatte eine zusätzliche Einschränkung, ich wurde mit .net ausdrücken, so konnte ich den Standard-Hardware-Abfragemechanismus nicht verwenden. Also beschloss ich, Power Shell zu verwenden, um die Abfrage zu tun. Der vollständige Code sieht wie folgt 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

nachschlagen CPUID für eine Option. Es könnte einige Probleme mit Multi-CPU-Systemen sein.

Versuchen Sie dieses, es gibt eine eindeutige ID-Festplatte: Port of DiskId32 für Delphi 7-2010 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top