Generar un id de máquina único


Necesito escribir una función que genere un id que sea único para una máquina dada que ejecute un sistema operativo Windows.

Actualmente, estoy usando WMI para consultar varios parámetros de hardware y concatenar juntos y hash ellos para derivar el id único. 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 el id único. Y estoy usando el primer resultado si hay múltiples resultados para cada uno métrica.

Sin embargo, me encontré con un problema en el que una máquina que se inicia dual en 2 diferentes sistemas operativos Windows genera diferentes códigos de sitio 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
Author: bluish, 2008-09-19

15 answers

Analiza el SMBIOS tú 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, el "id único" de la instrucción CPUID está obsoleto de P3 y posteriores.

 21
Author: Jonas Gulle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 11:53:17

Tuve el mismo problema y después de un poco de investigación decidí que lo mejor sería leer MachineGuid en 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 del sistema operativo nueva. Dependiendo de la versión del sistema operativo, puede contener la dirección MAC del adaptador de red incrustada (además de algunos otros números, incluidos aleatorios), o un número pseudoaleatorio, el último para las versiones más nuevas del sistema operativo (después de XP SP2, creo, pero no estoy seguro). Si es un pseudoaleatorio teóricamente, se puede falsificar si dos máquinas tienen el mismo estado inicial, incluido el reloj en tiempo real. En la práctica, esto será raro, pero tenga en cuenta si espera que sea una base para la seguridad que puede ser atacada por hackers hardcore.

Por supuesto, una entrada del registro también puede ser cambiada fácilmente por cualquiera 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 normal lo haría (de nuevo, tenga cuidado con hackers hardcore).

 70
Author: Fabio Ceconello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 13:09:28

Con nuestra herramienta de licencias consideramos los siguientes componentes

  • Dirección MAC
  • CPU (No el número de serie, sino el perfil de CPU real como stepping y model)
  • Número de Serie de la Unidad del Sistema (No Etiqueta de Volumen)
  • Memoria
  • Modelo y proveedor de CD-ROM
  • Modelo de tarjeta de video y proveedor
  • Controlador IDE
  • Controlador SCSI

Sin embargo, en lugar de simplemente hash los componentes y crear un sistema de pasa/falla, creamos una huella digital comparable que se puede utilizar para determinar qué tan diferentes son los dos perfiles de la máquina. Si la calificación de diferencia está por encima de una tolerancia especificada, pídale al usuario que la active de nuevo.

Hemos encontrado en los últimos 8 años en uso con cientos de miles de instalaciones de usuarios finales que esta combinación funciona bien para proporcionar un identificador de máquina único confiable, incluso para máquinas virtuales e instalaciones de SO clonados.

 28
Author: Paul Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-05 15:23:14

Odio ser el tipo que dice, "lo estás haciendo mal" (siempre odio a ese tipo ;) pero...

¿Tiene que generarse de forma repetible para la máquina única? ¿Podría simplemente asignar el identificador o hacer una clave pública/privada? Tal vez si pudiera generar y almacenar el valor, podría acceder desde ambas instalaciones del sistema operativo en el mismo disco?

Probablemente hayas explorado estas opciones y no funcionan para ti, pero si no, es algo a considerar.

Si no es un cuestión de la confianza del usuario, solo podría usar direcciones MAC.

 2
Author: Sam Hoice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 05:36:45

¿Qué hay de solo usar el UniqueID del procesador?

 2
Author: gizmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 13:01:51

Usted debe buscar en el uso de la dirección MAC en la tarjeta de red (si existe). Estos son por lo general únicos, pero pueden ser fabricados. He utilizado software que genera su archivo de licencia basado en su dirección MAC del adaptador de red, por lo que se considera una forma bastante confiable de distinguir entre computadoras.

 1
Author: Kyle Cronin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 05:45:38

Para una de mis aplicaciones, utilizo el nombre del equipo si no es equipo de dominio, o el SID de cuenta de equipo de dominio para equipos de dominio. Mark Russinovich habla de ello en este post 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 utiliza SID de máquina para identificar de forma única los equipos. 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 tener la misma máquina SID. El software que se basa en identidades de equipo únicas utiliza nombres de equipo o SID de dominio de equipo (el SID de las cuentas de equipo en el Dominio).

Puede acceder a la cuenta de la máquina de dominio SID a través de LDAP o System.DirectoryServices.

 1
Author: cmcginty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 13:04:26

En mi programa primero busco Terminal Server y uso el WTSClientHardwareId. De lo contrario, la dirección MAC del PC local debería ser adecuada.

Si realmente desea usar la lista de propiedades que proporcionó, deje fuera cosas como Name y DriverVersion, Clockspeed, etc. ya que es posiblemente dependiente del sistema operativo. Trate de emitir la misma información en ambos sistemas operativos y dejar de lado lo que difiere entre.

 1
Author: AngelBlaZe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 13:05:52

¿Por qué no utilizar la dirección MAC de su tarjeta de red?

 0
Author: Brian Matthews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 05:35:37

Tal vez hacer trampa un poco, pero la dirección MAC de un adaptador Ethernet de máquinas rara vez cambia sin que la placa base cambie en estos días.

 0
Author: bfabry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 05:36:16

¿Puede obtener 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 se como hacerlo en Windows.

 0
Author: Christopher Cashell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 05:36:54

Hay una biblioteca disponible para obtener información específica del hardware: Extractor de número de serie de hardware (CPU, RAM, HDD, BIOS)

 0
Author: ariwez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-30 09:03:45

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. Así que decidí usar power shell para hacer la consulta. El código completo se ve así:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function
 0
Author: user2515235,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-03 19:50:25

Busca CPUID para una opción. Puede haber algunos problemas con los sistemas multi-CPU.

 -1
Author: BCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 13:00:53

Pruebe este, da un ID de disco duro único: Puerto de DiskId32 para Delphi 7-2010.

 -1
Author: wahm sarab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-09 07:16:20