Génération d'un ID de machine unique

J'ai besoin d'écrire une fonction qui génère un id unique pour une machine donnée exécutant un système D'exploitation Windows.

Actuellement, j'utilise WMI pour interroger divers paramètres matériels et les concaténer ensemble et les hacher pour dériver l'id unique. Ma question est, quels sont les paramètres suggérés que je devrais utiliser? Actuellement, j'utilise une combinaison de données bios cpudisk pour générer l'id unique. Et j'utilise le premier résultat si plusieurs résultats sont là pour chacun métrique.

Cependant, j'ai rencontré un problème où une machine qui démarre deux fois dans 2 systèmes D'exploitation Windows différents génère des codes de site différents sur chaque système d'exploitation, ce qui ne devrait idéalement pas arriver.

Pour référence, ce sont les métriques que j'utilise actuellement:

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
95
demandé sur bluish 2008-09-19 09:30:03

15 réponses

Analysez vous-même le SMBIOS et hachez - le à une longueur arbitraire. Voir la spécification PDF pour toutes les structures SMBIOS disponibles.

Pour interroger le SMBIOS info à partir de Windows vous pouvez utiliser EnumSystemFirmwareEntries, EnumSystemFirmwareTables et GetSystemFirmwareTable.

IIRC, le "id unique" de L'instruction CPUID est obsolète de P3 et plus récent.

21
répondu Jonas Gulle 2015-06-05 11:53:17

J'ai eu le même problème et après un peu de recherche, j'ai décidé que le mieux serait de lire MachineGuid dans la clé de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, comme @Agnus suggéré. Il est généré lors de l'installation du système D'exploitation et ne changera pas à moins que vous ne fassiez une autre nouvelle installation du système d'exploitation. Selon la version du système D'exploitation, il peut contenir l'adresse MAC de la carte réseau intégrée (plus d'autres numéros, y compris aléatoires), ou un numéro pseudo-aléatoire, le plus tard pour les nouvelles versions du système d'exploitation (après XP SP2, je crois, mais pas sûr). Si c'est une pseudorandom théoriquement, il peut être forgé - si deux machines ont le même état initial, y compris l'horloge en temps réel. En pratique, ce sera rare, mais sachez si vous vous attendez à ce qu'il soit une base de sécurité qui peut être attaqué par des pirates hardcore.

Bien sûr, une entrée de Registre peut également être facilement modifiée par n'importe qui pour forger un GUID de machine, mais ce que j'ai trouvé, c'est que cela perturberait le fonctionnement normal de tant de composants de Windows que, dans la plupart des cas, aucun Utilisateur régulier ne le ferait (encore une fois, attention hardcore pirates).

70
répondu Fabio Ceconello 2012-03-01 13:09:28

Avec notre outil de licence , nous considérons les composants suivants

  • Adresse MAC
  • CPU (pas le numéro de série, mais le profil CPU réel comme stepping et modèle)
  • Numéro De Série Du Lecteur Système (Pas D'Étiquette De Volume)
  • Mémoire
  • Modèle et fournisseur de CD-ROM
  • modèle de carte vidéo et fournisseur
  • contrôleur IDE
  • Contrôleur SCSI

Cependant, plutôt que de simplement hacher les composants et de créer un système pass / fail, nous créons une empreinte comparable {[2] } qui peut être utilisée pour déterminer les différents profils de deux machines. Si la note de différence est supérieure à une tolérance spécifiée, demandez à l'utilisateur de l'activer à nouveau.

Nous avons constaté au cours des 8 dernières années d'utilisation avec des centaines de milliers d'installations d'utilisateurs finaux que cette combinaison fonctionne bien pour fournir un ID de machine unique, même pour les machines virtuelles et les installations de systèmes d'exploitation clonés.

28
répondu Paul Alexander 2012-05-05 15:23:14

Je déteste être le gars qui dit, "vous faites juste mal" (je déteste toujours ce gars ;) mais...

Doit-il être généré de manière répétée pour la machine unique? Pourriez-vous attribuer l'identifiant ou faire une clé publique/privée? Peut-être que si vous pouviez générer et stocker la valeur, vous pourriez y accéder à partir des deux installations du système d'exploitation sur le même disque?

Vous avez probablement exploré ces options et elles ne fonctionnent pas pour vous, mais sinon, c'est quelque chose à considérer.

Si ce n'est pas un question de confiance des utilisateurs, vous pouvez simplement utiliser des adresses MAC.

2
répondu Sam Hoice 2008-09-19 05:36:45

Qu'en est-il simplement de l'utilisation de L'UniqueID du processeur?

2
répondu gizmo 2012-03-01 13:01:51

Vous devriez envisager d'utiliser l'adresse MAC sur la carte réseau (si elle existe). Ceux-ci sont généralement uniques, mais peuvent être fabriqués. J'ai utilisé un logiciel qui génère son fichier de licence en fonction de l'adresse MAC de votre carte réseau, il est donc considéré comme un moyen assez fiable de faire la distinction entre les ordinateurs.

1
répondu Kyle Cronin 2008-09-19 05:45:38

Pour l'une de mes applications, j'utilise soit le nom de l'ordinateur s'il s'agit d'un ordinateur non-domaine, soit le compte de la machine de domaine SID pour les ordinateurs de domaine. Mark Russinovich en parle dans ce billet de blog, Machine SID :

Le dernier cas où la duplication SID serait un problème est si une application distribuée utilisait des SID de la machine pour identifier de manière unique les ordinateurs. Aucun logiciel Microsoft ne le fait et l'utilisation de la machine SID de cette façon ne fonctionne pas seulement pour le fait que tous les DC avoir la même machine SID. Les logiciels qui reposent sur des identités informatiques uniques utilisent des noms d'ordinateurs ou des noms de domaine D'ordinateur (le SID des comptes d'ordinateurs dans le domaine).

Vous pouvez accéder au compte de machine de domaine SID via LDAP ou System.DirectoryServices.

1
répondu cmcginty 2012-03-01 13:04:26

Dans mon programme, je vérifie D'abord Terminal Server et utilise le WTSClientHardwareId. Sinon, l'adresse MAC du PC local devrait être adéquate.

Si vous voulez vraiment utiliser la liste de propriétés que vous avez prévu de sortir des choses comme Name et DriverVersion, Clockspeed, etc. puisque c'est peut-être dépendant du système D'exploitation. Essayez de sortir les mêmes informations sur les deux systèmes d'exploitation et laissez de côté ce qui diffère entre.

1
répondu AngelBlaZe 2012-03-01 13:05:52

Pourquoi ne pas utiliser l'adresse MAC de votre carte réseau?

0
répondu Brian Matthews 2008-09-19 05:35:37

Peut-être tricher un peu, mais l'adresse MAC d'un adaptateur Ethernet de machines change rarement sans que la carte mère change ces jours-ci.

0
répondu bfabry 2008-09-19 05:36:16

Pouvez-vous tirer une sorte de numéro de série du fabricant ou une étiquette de service?

Notre boutique est une boutique Dell, nous utilisons donc l'étiquette de service unique à chaque machine pour les identifier. Je sais qu'il peut être interrogé à partir du BIOS, au moins sous Linux, mais je ne sais pas comment le faire sous Windows.

0
répondu Christopher Cashell 2008-09-19 05:36:54

Il existe une bibliothèque pour obtenir des informations spécifiques au matériel: Hardware serial number extractor (CPU, RAM, HDD, BIOS)

0
répondu ariwez 2014-04-30 09:03:45

J'avais une contrainte supplémentaire, j'utilisais. Net express donc je ne pouvais pas utiliser le mécanisme de requête matérielle standard. J'ai donc décidé d'utiliser Power shell pour faire la requête. Le code complet ressemble à ceci:

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
répondu user2515235 2018-07-03 19:50:25

Recherchez CPUID pour une option. Il pourrait y avoir des problèmes avec les systèmes multi-CPU.

-1
répondu BCS 2012-03-01 13:00:53

Essayez celui-ci, il donne un ID de disque dur unique: Port de DiskId32 pour Delphi 7-2010.

-1
répondu wahm sarab 2013-07-09 07:16:20