¿Cómo obtener Hardware-ID en C #?

Necesito en mi progtwig vincular una licencia a una identificación de hardware. Intenté usar WMI, pero aún lento.

Necesito, por ejemplo, información sobre CPU, HDD y placa base.

Para más detalles, consulte este enlace

El siguiente código le dará ID de CPU:

espacio de nombres requerido 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; } 

Para la identificación del disco duro y los detalles de la identificación de la placa madre, consulte este enlace

Para acelerar este procedimiento, asegúrese de no usar SELECT * , sino solo seleccionar lo que realmente necesita. Utilice SELECT * solo durante el desarrollo cuando intente averiguar qué necesita usar, ya que la consulta tardará mucho más en completarse.

Llegué aquí buscando lo mismo y encontré otra solución. Si ustedes están interesados, comparto esta clase:

 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 } } 

No tomaré ningún crédito por esto porque lo encontré aquí. Funcionó más rápido de lo que esperaba para mí. Sin la tarjeta gráfica, mac e id del disco obtuve la identificación única en unos 2-3 segundos. Con los anteriores incluidos, lo obtuve en unos 4-5 segundos.

El siguiente enfoque se inspiró en esta respuesta a una pregunta relacionada (más general).

El enfoque es leer el valor de MachineGuid en la clave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography . Este valor se genera durante la instalación del sistema operativo.

Hay algunas maneras de evitar la singularidad del Hardware-ID por máquina que utiliza este enfoque. Un método es editar el valor del registro, pero esto causaría complicaciones en la máquina del usuario después. Otro método es clonar una imagen de unidad que copiará el valor de MachineGuid .

Sin embargo, ningún enfoque es a prueba de intrusos y esto sin duda será lo suficientemente bueno para los usuarios normales. En el lado positivo, este enfoque es rápido en cuanto a rendimiento y simple de implementar.

 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(); } } } 

Aquí hay una DLL que muestra:
* ID del disco duro (número de serie único del hardware escrito en el chip electrónico IDE del disco)
* Partition ID (número de serie del volumen)
* ID de la CPU (ID de hardware único)
* Proveedor de CPU
* Velocidad de funcionamiento de la CPU
* Velocidad teórica de la CPU
* Carga de memoria (memoria total utilizada en porcentaje (%))
* Total físico (memoria física total en bytes)
* Avail Physical (memoria física dejada en bytes)
* Total PageFile (Total de archivos de página en bytes)
* Archivo de página disponible (archivo de página dejado en bytes)
* Total Virtual (memoria virtual total en bytes)
* Disponible Virtual (memoria virtual dejada en bytes)
* Número de identificación único de BiosBiosDate
* Número de identificación único de BiosBiosVersion
* Número de identificación único de BiosBiosProductID
* Número de identificación único de BiosBiosVideo

(texto tomado del sitio web original)
Funciona con C #.