Necesito escribir una función que genere una identificación que sea única para una máquina determinada que ejecuta un sistema operativo Windows.
Actualmente, estoy usando WMI para consultar varios parámetros de hardware y concatenarlos juntos y aplicarles hash para obtener la identificación única. Mi pregunta es, ¿cuáles son los parámetros sugeridos que debo usar? Actualmente, estoy usando una combinación de datos de bios \ cpu \ disk para generar la identificación única. Y estoy usando el primer resultado si hay varios resultados para cada métrica.
Sin embargo, me encontré con un problema en el que una máquina que arranca dos veces en 2 sistemas operativos Windows diferentes genera códigos de sitio diferentes en cada sistema operativo, lo que idealmente no debería suceder.
Como referencia, estas son las métricas que estoy usando actualmente:
Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name
closeEnough
función para que aceptara una identificación que no coincida si solo variaba en 2 campos. También incluyo detalles sobre el procesador y el disco duro del sistema en mi hash porque al principio tuve colisiones entre sistemas idénticos.Tuve el mismo problema y después de investigar un poco decidí que lo mejor sería leer la
MachineGuid
clave de registroHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
, como sugirió @Agnus. Se genera durante la instalación del sistema operativo y no cambiará a menos que realice otra instalación nueva del sistema operativo. Dependiendo de la versión del sistema operativo, puede contener la dirección MAC del adaptador de red incorporada (más algunos otros números, incluido el aleatorio), o un número pseudoaleatorio, el último para las versiones más recientes del sistema operativo (después de XP SP2, creo, pero no estoy seguro). Si es un pseudoaleatorio en teoría, se puede falsificar, si dos máquinas tienen el mismo estado inicial, incluido el reloj de tiempo real. En la práctica, esto será raro, pero tenga en cuenta si espera que sea una base de seguridad que pueda ser atacada por piratas informáticos expertos.Por supuesto, cualquiera puede cambiar fácilmente una entrada de registro para falsificar un GUID de máquina, pero lo que encontré es que esto interrumpiría el funcionamiento normal de tantos componentes de Windows que, en la mayoría de los casos, ningún usuario habitual lo haría (de nuevo, tenga cuidado para los hackers incondicionales).
fuente
Con nuestra herramienta de licencias consideramos los siguientes componentes
Sin embargo, en lugar de simplemente aplicar hash a los componentes y crear un sistema de aprobación / falla, creamos una huella digital comparable que se puede usar para determinar cuán diferentes son los perfiles de dos máquinas. Si la clasificación de diferencia está por encima de una tolerancia especificada, solicite al usuario que la active nuevamente.
Durante los últimos 8 años, en uso con cientos de miles de instalaciones de usuarios finales, hemos descubierto que esta combinación funciona bien para proporcionar una identificación de máquina única y confiable, incluso para máquinas virtuales e instalaciones de SO clonadas.
fuente
¿Qué hay de usar el UniqueID del procesador?
fuente
Odio ser el tipo que dice, "simplemente lo estás haciendo mal" (siempre odio a ese tipo;) pero ...
¿Tiene que generarse de forma repetida para la máquina única? ¿Podría simplemente asignar el identificador o hacer una clave pública / privada? ¿Quizás si pudiera generar y almacenar el valor, podría acceder a él desde las instalaciones de ambos sistemas operativos en el mismo disco?
Probablemente ha explorado estas opciones y no funcionan para usted, pero si no, es algo a considerar.
Si no se trata de la confianza del usuario, puede usar direcciones MAC.
fuente
Debería considerar el uso de la dirección MAC en la tarjeta de red (si existe). Suelen ser únicos, pero pueden fabricarse. He usado software que genera su archivo de licencia basado en la dirección MAC de su adaptador de red, por lo que se considera una forma bastante confiable de distinguir entre computadoras.
fuente
Para una de mis aplicaciones, utilizo el nombre de la computadora si no es una computadora de dominio, o el SID de la cuenta de la máquina de dominio para las computadoras de dominio. Mark Russinovich habla de ello en esta publicación de blog, Machine SID :
Puede acceder al SID de la cuenta de la máquina de dominio a través de LDAP o
System.DirectoryServices
.fuente
En mi programa, primero compruebo Terminal Server y uso el WTSClientHardwareId. De lo contrario, la dirección MAC de la PC local debería ser la adecuada.
Si realmente desea utilizar la lista de propiedades que ya ha proporcionado dejar de lado cosas como
Name
eDriverVersion
,Clockspeed
, etc., ya que es, posiblemente, depende del sistema operativo. Intente generar la misma información en ambos sistemas operativos y omita lo que difiere entre ellos.fuente
Hay una biblioteca disponible para obtener información específica de hardware: Extractor de número de serie de hardware (CPU, RAM, HDD, BIOS)
fuente
¿Por qué no utilizar la dirección MAC de su tarjeta de red?
fuente
Tal vez haga un poco de trampa, pero la dirección MAC de un adaptador Ethernet de una máquina rara vez cambia sin que cambie la placa base en estos días.
fuente
¿Puede extraer algún tipo de número de serie del fabricante o etiqueta de servicio?
Nuestra tienda es una tienda de Dell, por lo que utilizamos la etiqueta de servicio que es única para cada máquina para identificarlos. Sé que se puede consultar desde el BIOS, al menos en Linux, pero no sé cómo hacerlo en Windows.
fuente
Tenía una restricción adicional, estaba usando .net express, por lo que no podía usar el mecanismo de consulta de hardware estándar. Entonces decidí usar Power Shell para hacer la consulta. El código completo se ve así:
fuente
Busque CPUID para una opción. Puede haber algunos problemas con los sistemas con varias CPU.
fuente
Pruebe este, le da una ID de disco duro única: Puerto de DiskId32 para Delphi 7-2010 .
fuente