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
closeEnough
Funktion 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.Ich hatte das gleiche Problem und nach ein wenig Recherche entschied ich, dass es am besten wäre, den
MachineGuid
Registrierungsschlüssel einzulesenHKEY_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).
quelle
Mit unserem Lizenzierungswerkzeug berücksichtigen wir die folgenden Komponenten
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.
quelle
Was ist mit der UniqueID des Prozessors?
quelle
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.
quelle
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.
quelle
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 :
Sie können über LDAP oder auf die SID des Domänencomputerkontos zugreifen
System.DirectoryServices
.quelle
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
Name
undDriverVersion
,Clockspeed
usw. , da es möglicherweise ist abhängig vom Betriebssystem. Versuchen Sie, auf beiden Betriebssystemen die gleichen Informationen auszugeben, und lassen Sie die Unterschiede aus.quelle
Für den Abruf hardwarespezifischer Informationen steht eine Bibliothek zur Verfügung: Hardware-Seriennummern-Extraktor (CPU, RAM, HDD, BIOS)
quelle
Warum nicht die MAC-Adresse Ihrer Netzwerkkarte verwenden?
quelle
Vielleicht ein bisschen schummeln, aber die MAC-Adresse eines Ethernet-Adapters eines Computers ändert sich selten, ohne dass sich das Motherboard heutzutage ändert.
quelle
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.
quelle
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:
quelle
Suchen Sie nach der CPUID für eine Option. Bei Systemen mit mehreren CPUs können Probleme auftreten.
quelle
Versuchen Sie dies, es gibt eine eindeutige Festplatten-ID: Port von DiskId32 für Delphi 7-2010 .
quelle