windows - para - mp3tag v2 54
Generando una ID de máquina única (14)
Necesito escribir una función que genere una identificación que sea única para una máquina determinada que ejecute un sistema operativo Windows.
Actualmente, estoy usando WMI para consultar varios parámetros de hardware y concatenarlos juntos y hash para derivar el ID único. Mi pregunta es, ¿cuáles son los parámetros sugeridos que debería 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 múltiples resultados para cada métrica.
Sin embargo, me encontré con un problema en el que una máquina que se inicia en dos sistemas operativos de Windows diferentes genera códigos de sitio diferentes en cada sistema operativo, lo que idealmente no debería ocurrir.
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
¿Por qué no usar la dirección MAC de su tarjeta de red?
¿Puedes sacar algún tipo de número de serie del fabricante o etiqueta de servicio?
Nuestra tienda es una tienda 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.
¿Qué tal si usamos UniqueID del procesador?
Busque CPUID para una opción. Puede haber algunos problemas con los sistemas multi-CPU.
Con nuestra herramienta de licencias consideramos los siguientes componentes
- Dirección MAC
- CPU (no es el número de serie, sino el perfil real de la CPU, como el escalonamiento y el modelo)
- Número de serie de la unidad del sistema (no etiqueta de volumen)
- Memoria
- Modelo y vendedor de CD-ROM
- Modelo y vendedor de tarjeta de video
- Controlador IDE
- Controlador SCSI
Sin embargo, en lugar de simplemente mezclar los componentes y crear un sistema de aprobación / falla, creamos una huella digital comparable que se puede usar para determinar qué tan diferentes son dos perfiles de máquina. Si la clasificación de diferencia está por encima de una tolerancia especificada, solicite al usuario que se active nuevamente.
Durante los últimos 8 años, hemos utilizado cientos de miles de instalaciones para usuarios finales, y esta combinación funciona bien para proporcionar una id de máquina única y confiable, incluso para máquinas virtuales e instalaciones de sistemas operativos clonadas.
Debería considerar usar la dirección MAC en la tarjeta de red (si existe). Esos son usualmente únicos pero pueden ser fabricados. He usado un 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.
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 adecuada.
Si realmente desea utilizar la lista de propiedades que proporcionó, Clockspeed
cosas como Name
y DriverVersion
, Clockspeed
, etc., ya que posiblemente dependa del sistema operativo. Intente generar la misma información en ambos sistemas operativos y omita lo que difiere entre ellos.
Hay una biblioteca disponible para obtener información específica del hardware: extractor de número de serie del hardware (CPU, RAM, disco duro, BIOS)
Odio ser el tipo que dice: "lo estás haciendo mal" (yo siempre odio a ese tipo;) pero ...
¿Tiene que generarse repetidamente para la máquina única? ¿Podría simplemente asignar el identificador o hacer una clave pública / privada? ¿Tal vez si pudieras generar y almacenar el valor, podrías acceder desde ambas instalaciones del sistema operativo en el mismo disco?
Probablemente haya explorado estas opciones y no funcionen para usted, pero si no es algo que debe tener en cuenta.
Si no se trata de una cuestión de confianza del usuario, puede usar direcciones MAC.
Para una de mis aplicaciones, uso el nombre de la computadora si no es una computadora de dominio o la cuenta de máquina de dominio SID para las computadoras de dominio. Mark Russinovich habla sobre esto en esta publicación de blog, Machine SID :
El último caso en el que la duplicación de SID sería un problema es si una aplicación distribuida utilizaba SID de la máquina para identificar de forma exclusiva las computadoras. Ningún software de Microsoft lo hace y usar el SID de la máquina de esa manera no funciona solo por el hecho de que todos los DC tienen el mismo SID de la máquina. El software que se basa en identidades únicas de computadora usa nombres de computadora o SID de dominio de computadora (el SID de las cuentas de la computadora en el Dominio).
Puede acceder al SID de la cuenta de máquina de dominio a través de LDAP o System.DirectoryServices
.
Parse el SMBIOS usted mismo y hash a una longitud arbitraria. Consulte la especificación PDF para todas las estructuras SMBIOS disponibles.
Para consultar la información de SMBIOS desde Windows, puede usar EnumSystemFirmwareEntries
, EnumSystemFirmwareTables
y GetSystemFirmwareTable
.
IIRC, la "identificación única" de la instrucción CPUID está obsoleta desde P3 y más reciente.
Pruebe este, le da una identificación única del disco duro: Puerto de DiskId32 para Delphi 7-2010 .
Tal vez hacer trampa un poco, pero la dirección MAC de un adaptador Ethernet de una máquina rara vez cambia sin que la placa base cambie en estos días.
Tuve el mismo problema y después de investigar un poco decidí que lo mejor sería leer MachineGuid
en la clave de registro HKEY_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 SO, puede contener la dirección MAC del adaptador de red incrustado (más algunos otros números, incluido el aleatorio) o un número pseudoaleatorio, el último para versiones del sistema operativo más recientes (después de XP SP2, creo, pero no estoy seguro). Si se trata de un pseudoaleatorio teóricamente puede falsificarse, si dos máquinas tienen el mismo estado inicial, incluido el reloj de tiempo real. En la práctica, esto será raro, pero ten en cuenta si esperas que sea una base de seguridad que pueda ser atacada por hackers hardcore.
Por supuesto, una entrada de registro también puede ser cambiada fácilmente por cualquiera para forjar 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 regular lo haría (nuevamente, cuidado para hackers hardcore).