Pregunta

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, concatenarlos y aplicar hash para derivar la identificación única.Mi pregunta es ¿cuáles son los parámetros sugeridos que debo utilizar?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 dualmente 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
¿Fue útil?

Solución

Analizar el SMBIOS usted mismo y ajústelo a una longitud arbitraria.Ver el Especificaciones PDF para todas las estructuras SMBIOS disponibles.

Para consultar la información de SMBIOS desde Windows puedes usar EnumSystemFirmwareEntries, EnumSystemFirmwareTables y GetSystemFirmwareTable.

IIRC, la "identificación única" de la instrucción CPUID está obsoleta desde P3 y versiones posteriores.

Otros consejos

Tuve el mismo problema y después de investigar un poco 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 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, incluidos los aleatorios), o un número pseudoaleatorio, lo último para versiones más nuevas del sistema operativo (después de XP SP2, creo, pero no estoy seguro).Si, en teoría, es pseudoaleatorio, puede falsificarse: si dos máquinas tienen el mismo estado inicial, incluido el reloj de tiempo real.En la práctica, esto será poco común, pero tenga cuidado si espera que sea una base de seguridad que pueda ser atacada por piratas informáticos incondicionales.

Por supuesto, cualquiera también puede cambiar fácilmente una entrada de registro para falsificar un GUID de la máquina, pero lo que descubrí es que esto alteraría el funcionamiento normal de tantos componentes de Windows que en la mayoría de los casos ningún usuario normal lo haría (nuevamente, tenga cuidado). para hackers incondicionales).

Con nuestro herramienta de licencia consideramos los siguientes componentes

  • Dirección MAC
  • CPU (no el número de serie, sino el perfil de CPU real, como el paso a paso y el modelo)
  • Número de serie de la unidad del sistema (no etiqueta de volumen)
  • Memoria
  • Modelo y proveedor de CD-ROM
  • Modelo y proveedor de tarjeta de video
  • Controlador IDE
  • Controlador SCSI

Sin embargo, en lugar de simplemente mezclar los componentes y crear un sistema de aprobación/rechazo, creamos un huella digital comparable que se puede utilizar 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 la active nuevamente.

Hemos descubierto en los últimos 8 años de uso con cientos de miles de instalaciones de usuarios finales 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 sistemas operativos clonados.

Odio ser el tipo que dice "simplemente lo estás haciendo mal" (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?¿Quizás si pudiera generar y almacenar el valor, podría acceder a él desde ambas instalaciones del sistema operativo en el mismo disco?

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

Si no es una cuestión de confianza del usuario, puede utilizar direcciones MAC.

¿Qué tal simplemente usar el ID único del procesador?

Debería considerar utilizar la dirección MAC en la tarjeta de red (si existe).Suelen ser únicos, pero se pueden fabricar.He utilizado un software que genera su archivo de licencia en función de la dirección MAC de su adaptador de red, por lo que se considera una forma bastante confiable de distinguir entre computadoras.

Para una de mis aplicaciones, uso el nombre de la computadora si no es una computadora del dominio, o el SID de la cuenta de la máquina del dominio para las computadoras del dominio.Mark Russinovich habla de ello en esta entrada de blog, ID de la máquina:

El último caso en el que la duplicación de SID sería un problema es si una aplicación distribuida utilizara SID de máquina para identificar de forma única 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 de computadora únicas utiliza nombres de computadora o SID de dominio de computadora (el SID de las cuentas de computadora en el dominio).

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

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

Si realmente desea utilizar la lista de propiedades que proporcionó, omita 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 la que difiera entre ellos.

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

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

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

¿Puedes 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 identificarlas.Sé que se puede consultar desde la BIOS, al menos en Linux, pero no sé cómo hacerlo en Windows.

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 realizar 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

Busque CPUID para ver una opción.Puede haber algunos problemas con los sistemas de múltiples CPU.

Pruebe este, le proporciona una ID de disco duro única: Puerto de DiskId32 para Delphi 7-2010.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top