Wie bekomme ich schnell Hardware-ID in C #?

Ich brauche in meinem Programm eine Lizenz an eine Hardware-ID zu binden. Ich habe versucht, WMI zu verwenden, aber es ist immer noch langsam.

Ich brauche zum Beispiel Informationen über CPU, HDD und Motherboard.

Weitere Informationen finden Sie unter diesem Link

Der folgende Code gibt Ihnen CPU-ID:

Namespace erforderlich System.Management

 var mbs = new ManagementObjectSearcher("Select ProcessorId From Win32_processor"); ManagementObjectCollection mbsList = mbs.Get(); string id = ""; foreach (ManagementObject mo in mbsList) { id = mo["ProcessorId"].ToString(); break; } 

Details zur Festplatten-ID und Motherboard-ID finden Sie unter diesem Link

Um diesen Vorgang zu beschleunigen, stellen Sie sicher, dass Sie nicht SELECT * , sondern nur das auswählen, was Sie wirklich benötigen. Verwenden Sie SELECT * nur während der Entwicklung, wenn Sie versuchen, herauszufinden, was Sie verwenden müssen, da die Abfrage dann viel länger dauert.

Ich habe hier nach dem gleichen gesucht und eine andere Lösung gefunden. Wenn Sie interessiert sind, teile ich diese class:

 using System; using System.Management; using System.Security.Cryptography; using System.Security; using System.Collections; using System.Text; namespace Security { ///  /// Generates a 16 byte Unique Identification code of a computer /// Example: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9 ///  public class FingerPrint { private static string fingerPrint = string.Empty; public static string Value() { if (string.IsNullOrEmpty(fingerPrint)) { fingerPrint = GetHash("CPU >> " + cpuId() + "\nBIOS >> " + biosId() + "\nBASE >> " + baseId() //+"\nDISK >> "+ diskId() + "\nVIDEO >> " + videoId() +"\nMAC >> "+ macId() ); } return fingerPrint; } private static string GetHash(string s) { MD5 sec = new MD5CryptoServiceProvider(); ASCIIEncoding enc = new ASCIIEncoding(); byte[] bt = enc.GetBytes(s); return GetHexString(sec.ComputeHash(bt)); } private static string GetHexString(byte[] bt) { string s = string.Empty; for (int i = 0; i < bt.Length; i++) { byte b = bt[i]; int n, n1, n2; n = (int)b; n1 = n & 15; n2 = (n >> 4) & 15; if (n2 > 9) s += ((char)(n2 - 10 + (int)'A')).ToString(); else s += n2.ToString(); if (n1 > 9) s += ((char)(n1 - 10 + (int)'A')).ToString(); else s += n1.ToString(); if ((i + 1) != bt.Length && (i + 1) % 2 == 0) s += "-"; } return s; } #region Original Device ID Getting Code //Return a hardware identifier private static string identifier (string wmiClass, string wmiProperty, string wmiMustBeTrue) { string result = ""; System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollection moc = mc.GetInstances(); foreach (System.Management.ManagementObject mo in moc) { if (mo[wmiMustBeTrue].ToString() == "True") { //Only get the first one if (result == "") { try { result = mo[wmiProperty].ToString(); break; } catch { } } } } return result; } //Return a hardware identifier private static string identifier(string wmiClass, string wmiProperty) { string result = ""; System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollection moc = mc.GetInstances(); foreach (System.Management.ManagementObject mo in moc) { //Only get the first one if (result == "") { try { result = mo[wmiProperty].ToString(); break; } catch { } } } return result; } private static string cpuId() { //Uses first CPU identifier available in order of preference //Don't get all identifiers, as it is very time consuming string retVal = identifier("Win32_Processor", "UniqueId"); if (retVal == "") //If no UniqueID, use ProcessorID { retVal = identifier("Win32_Processor", "ProcessorId"); if (retVal == "") //If no ProcessorId, use Name { retVal = identifier("Win32_Processor", "Name"); if (retVal == "") //If no Name, use Manufacturer { retVal = identifier("Win32_Processor", "Manufacturer"); } //Add clock speed for extra security retVal += identifier("Win32_Processor", "MaxClockSpeed"); } } return retVal; } //BIOS Identifier private static string biosId() { return identifier("Win32_BIOS", "Manufacturer") + identifier("Win32_BIOS", "SMBIOSBIOSVersion") + identifier("Win32_BIOS", "IdentificationCode") + identifier("Win32_BIOS", "SerialNumber") + identifier("Win32_BIOS", "ReleaseDate") + identifier("Win32_BIOS", "Version"); } //Main physical hard drive ID private static string diskId() { return identifier("Win32_DiskDrive", "Model") + identifier("Win32_DiskDrive", "Manufacturer") + identifier("Win32_DiskDrive", "Signature") + identifier("Win32_DiskDrive", "TotalHeads"); } //Motherboard ID private static string baseId() { return identifier("Win32_BaseBoard", "Model") + identifier("Win32_BaseBoard", "Manufacturer") + identifier("Win32_BaseBoard", "Name") + identifier("Win32_BaseBoard", "SerialNumber"); } //Primary video controller ID private static string videoId() { return identifier("Win32_VideoController", "DriverVersion") + identifier("Win32_VideoController", "Name"); } //First enabled network card ID private static string macId() { return identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled"); } #endregion } } 

Ich werde dafür keinen Kredit nehmen, weil ich es hier gefunden habe. Es hat schneller geklappt als ich erwartet hatte. Ohne die Grafikkarte, Mac und Drive ID habe ich die eindeutige ID in ca. 2-3 Sekunden. Mit den oben genannten habe ich es in ca. 4-5 Sekunden geschafft.

Der folgende Ansatz wurde von dieser Antwort auf eine verwandte (allgemeinere) Frage inspiriert.

Der Ansatz besteht darin, den MachineGuid Wert im Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography zu lesen. Dieser Wert wird während der Installation des Betriebssystems generiert.

Es gibt wenige Wege um die Einzigartigkeit der Hardware-ID pro Maschine mit diesem Ansatz zu umgehen. Eine Methode besteht darin, den Registrierungswert zu bearbeiten, dies würde jedoch später auf dem Computer des Benutzers zu Komplikationen führen. Eine andere Methode besteht darin, ein Laufwerksbild zu klonen, das den MachineGuid Wert kopiert.

Jedoch ist kein Ansatz hack-proof und das wird sicherlich gut genug für normale Benutzer sein. Auf der positiven Seite ist dieser Ansatz schnell performant und einfach zu implementieren.

 public string GetMachineGuid() { string location = @"SOFTWARE\Microsoft\Cryptography"; string name = "MachineGuid"; using (RegistryKey localMachineX64View = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) { using (RegistryKey rk = localMachineX64View.OpenSubKey(location)) { if (rk == null) throw new KeyNotFoundException( string.Format("Key Not Found: {0}", location)); object machineGuid = rk.GetValue(name); if (machineGuid == null) throw new IndexOutOfRangeException( string.Format("Index Not Found: {0}", name)); return machineGuid.ToString(); } } } 

Hier ist eine DLL, die zeigt:
* Festplatten-ID (eindeutige Hardware-Seriennummer, die in den IDE-Elektronikchip des Laufwerks geschrieben wurde)
* Partitions-ID (Datenträger-Seriennummer)
* CPU-ID (eindeutige Hardware-ID)
* CPU-Anbieter
* CPU-Laufgeschwindigkeit
* CPU-theoretische Geschwindigkeit
* Speicherbelastung (Gesamtspeicher in Prozent (%))
* Total Physical (Gesamter physischer Speicher in Byte)
* Avail Physical (Physischer Speicher in Bytes)
* Total PageFile (Gesamtauslagerungsdatei in Byte)
* Available PageFile (Seitendatei in Bytes)
* Total Virtual (Gesamt virtueller Speicher in Byte)
* Available Virtual (Virtueller Speicher in Bytes)
* Bios eindeutige IdentifikationsnummerBiosDate
* Bios eindeutige IdentifikationsnummerBiosVersion
* Bios eindeutige IdentifikationsnummerBiosProductID
* Bios eindeutige IdentifikationsnummerBiosVideo

(Text von der ursprünglichen Website gegriffen)
Es funktioniert mit C #.