Wie man schnell Hardware-ID in C # bekommen?
-
22-09-2019 - |
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.
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 #.