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.
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.
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.
Buena y amplia respuesta +1 –
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
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
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#.
la idea era hacerlo en C# – Fredrik
@ 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
Además, obtiene la información en menos de 1 microsegundo. ¡Mientras recuperas información de MS Windows toma hasta 5 segundos! – thelight
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.
La DLL presentada a continuación recupera la información en menos de 1 microsegundo. – thelight
Este código es agradable. Tnq –
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();
}
}
}
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
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:
Ir al proyecto Tab
Haga clic en Agregar referencias
Haga clic en la pestaña .NET
Seleccionar System.Management y presione ok
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 "". –
Tal esquema de licencia suena más como una molestia para el cliente honesto que como una disuasión para un cracker. – CodesInChaos