Frage

Ich brauche in meinem Programm eine Lizenz für eine Hardware-ID zu binden. Ich habe versucht, die Verwendung von WMI, aber es immer noch langsam.

Ich brauche zum Beispiel CPU, Festplatte und Motherboard Info.

War es hilfreich?

Lösung

Weitere Informationen finden Sie unter diese Link

Der folgende Code wird 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;
}

Für Festplatten-ID und Motherboard-ID Details siehe this-Link

Um diese Prozedur zu beschleunigen, stellen Sie sicher, dass Sie SELECT * nicht verwenden, sondern nur wählen, was Sie wirklich brauchen. Verwenden SELECT * nur während der Entwicklung, wenn Sie versuchen, herauszufinden, was Sie verwenden müssen, denn dann wird die Abfrage nehmen viel länger.

Andere Tipps

Ich habe hier suchen für die gleiche Sache und ich eine andere Lösung gefunden. Wenn ihr interessiert sind, teile ich diese Klasse:

using System;
using System.Management;
using System.Security.Cryptography;
using System.Security;
using System.Collections;
using System.Text;
namespace Security
{
    /// <summary>
    /// Generates a 16 byte Unique Identification code of a computer
    /// Example: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9
    /// </summary>
    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 keinen Kredit dafür nehmen, weil ich es hier Es funktionierte schneller als ich für mich erwartet. Ohne die Grafikkarte, Mac und ich Auto id bekam die eindeutige ID in etwa 2-3 Sekunden. Mit den oben eingeschlossen habe ich es in etwa 4-5 Sekunden.

. Hinweis: In Bezug auf System.Management

Der folgende Ansatz wurde inspiriert von diese Antwort auf einen Zusammenhang mit (allgemeinen) Frage.

Der Ansatz ist es, den MachineGuid Wert in Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography zu lesen. Dieser Wert wird bei Installation des Betriebssystems erzeugt wird.

Es gibt nur wenige Möglichkeiten, um die Einzigartigkeit der Hardware-ID pro Maschine mit diesem Ansatz. Ein Verfahren ist das Bearbeiten des Registrierungswertes, aber dies würde zu Komplikationen auf den Computer des Benutzers danach. Eine andere Methode ist es, ein Laufwerk Bild zu klonen, die den MachineGuid Wert kopieren würde.

Allerdings ist kein Ansatz Hack-proof, und dies wird sicherlich gut genug für den normalen Nutzer. Auf der positiven Seite ist dieser Ansatz schnell Performance-weise 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:
* Festplatte ID (eindeutige Nummer geschrieben serielle Hardware in elektronischen Chip IDE-Laufwerks)
* Partitions-ID (Datenträger-Seriennummer)
* CPU-ID (eindeutige Hardware-ID)
* CPU-Anbieter
* CPU Laufgeschwindigkeit
* CPU theoretische Geschwindigkeit
* Memory Load (Gesamtspeicher in Prozent (% verwendet))
* Total Physical (Total physische Speicher in Bytes)
* Avail Physical (Physische Speicher in Bytes links)
* Gesamtauslagerungsdatei (Total Seite Datei in Bytes)
* Erhältlich Auslagerungsdatei (Seite Datei in Bytes links)
* Gesamt Virtuelle (Total virtuelle Speicher in Bytes)
* Erhältlich Virtuelle (Virtueller Speicher in Bytes links)
* Bios eindeutige Identifizierung numberBiosDate
* Bios eindeutige Identifizierung numberBiosVersion
* Bios eindeutige Identifizierung numberBiosProductID
* Bios eindeutige Identifizierung numberBiosVideo

(Text von der ursprünglichen Website gepackt)
Es arbeitet mit C #.

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