2010-02-25 26 views
33

Necesito en mi programa vincular una licencia a una identificación de hardware. Intenté usar WMI, pero aún lento.¿Cómo obtener rápidamente Hardware-ID en C#?

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

+4

Tal esquema de licencia suena más como una molestia para el cliente honesto que como una disuasión para un cracker. – CodesInChaos

Respuesta

63

Para más detalles se refieren a this link

El siguiente código le dará CPU ID:

espacio de nombres Necesitados 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 la placa base detalles ID refieren this-link

Para acelerar este procedimiento, asegúrese de no utilizar SELECT *, pero solo selecciona lo que realmente necesitas. Use SELECT * solo durante el desarrollo cuando intente averiguar qué necesita usar, porque la consulta tardará más de en completar.

+1

Buena y amplia respuesta +1 –

+10

Tenga en cuenta, sin embargo, que estas identificaciones no son necesariamente únicas, o incluso inexistentes. El ID de procesador solo identifica el diseño del procesador, el número de serie de volumen puede ser cambiado por el usuario y hay fabricantes de placa base que no establecen un número de serie. – Jens

+1

La mejor manera de generar una identificación única es hacer una identificación por combinación de todas estas identificaciones, por ejemplo, ID de la CPU, ID de la placa base e ID del disco duro. – HotTester

-1

Here es un DLL que muestra:
* Disco duro Identificación (hardware único número de serie escrito en chip electrónico IDE de la unidad)
* Identificación de reparto (número de serie de volumen)
* CPU ID (identificador de hardware exclusivo)
* proveedor CPU
* CPU en ejecución velocidad
* teórico CPU velocidad
* La carga de memoria (memoria total utilizada en porcentaje (%))
* total física (memoria física total en bytes)
* Disponibilidad física (memoria física dada en bytes)
* Total de archivo de paginación (archivo total página en bytes)
* Disponible (archivo de página a la izquierda en bytes) de archivo de paginación
* virtual (memoria virtual total en bytes) Total
* disponible virtual (memoria virtual a la izquierda en bytes) numberBiosDate
Bios * identificación única
* numberBiosVersion Bios identificación única
* Bios identificación única numberBiosProductID
* numberBiosVideo Bios identificación única

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

+0

la idea era hacerlo en C# – Fredrik

+2

@ Frederic: la publicación original muestra que la ID es necesaria para un sistema de seguridad (licencia). Sin embargo, el código proporcionado en las respuestas está leyendo la información de MS Windows. Es muy fácil modificar esa información. Sin embargo, el archivo DLL de Hardware ID Extractor obtiene la información directamente de la CPU (nivel de hardware). No puede cambiar la identificación del hardware de una CPU (a menos que derrita la CPU y la reconstruya :)) – thelight

+1

Además, obtiene la información en menos de 1 microsegundo. ¡Mientras recuperas información de MS Windows toma hasta 5 segundos! – thelight

16

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

no voy a tomar ningún crédito por esto porque me encontré here Se trabajó 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.

+0

La DLL presentada a continuación recupera la información en menos de 1 microsegundo. – thelight

+0

Este código es agradable. Tnq –

9

El siguiente enfoque fue inspirado por this answer a una pregunta relacionada (más general).

El enfoque es leer el valor 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 MachineGuid.

Sin embargo, ningún enfoque es a prueba de intrusiones 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(); 
     } 
    } 
} 
+0

la edición del valor de registro es rápida y 'no necesariamente produce problemas en la máquina del usuario' - puede editarlo, hacer lo que quiera (en el s/w) y revertir el valor. – NSGaga

-5

este código no funcionan hasta que seguir los siguientes pasos u

Agregar referencia a la Asamblea System.Management.

Para esto se tiene que hacer:

  1. Ir al proyecto Tab

  2. Haga clic en Agregar referencias

  3. Haga clic en la pestaña .NET

  4. Seleccionar System.Management y presione ok

+0

Te he subido de categoría, pero he votado de nuevo porque esta no es una respuesta, esto realmente debería ser un comentario en la publicación del código en particular. Aunque no puede estructurar una respuesta como esta, simplemente puede reducir esto para decir "Este código no funcionará si no tiene una referencia de ensamblado para" System.Management "". –

Cuestiones relacionadas