Question

Je dois écrire une fonction générant un identifiant unique pour un ordinateur fonctionnant sous Windows.

Actuellement, j'utilise WMI pour interroger divers paramètres matériels, les concaténer et les hacher pour en déduire l'identifiant unique. Ma question est la suivante: quels sont les paramètres suggérés que je devrais utiliser? Actuellement, j'utilise une combinaison de données bios \ cpu \ disk pour générer l'identifiant unique. Et j'utilise le premier résultat si plusieurs résultats sont présents pour chaque métrique.

Cependant, j'ai rencontré un problème dans lequel une machine qui effectue un double amorçage sous 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 se produire.

Pour référence, voici les statistiques 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
Était-ce utile?

La solution

Analysez le SMBIOS et divisez-le à une longueur arbitraire. Voir la spécification PDF pour toutes les structures SMBIOS disponibles.

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

IIRC, le "identifiant unique" de l'instruction CPUID est déconseillé à partir de P3 et plus récente.

Autres conseils

J'ai eu le même problème et après quelques recherches, j'ai décidé que le mieux serait de lire MachineGuid dans la clé de registre HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography , sous la forme @Agnus suggéré. Il est généré lors de l'installation du système d'exploitation et ne changera que si vous effectuez une 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 (ainsi que d'autres numéros, notamment aléatoires), ou un nombre pseudo-aléatoire, la dernière pour les versions de système d'exploitation plus récentes (après XP SP2, je crois, mais je ne suis pas sûr). Si c'est un pseudo-aléatoire théoriquement, il peut être falsifié - si deux machines ont le même état initial, y compris l'horloge temps réel. En pratique, cela sera rare, mais sachez si vous vous attendez à ce que ce soit une base de sécurité pouvant être attaquée par des pirates informatiques assidus.

Bien sûr, tout le monde peut facilement modifier une entrée de registre pour créer un GUID d'ordinateur, mais ce que j'ai trouvé, c'est que cela perturberait le fonctionnement normal de nombreux composants de Windows qu'aucun utilisateur habituel ne le ferait (encore une fois). , méfiez-vous des pirates hardcore).

Grâce à notre outil de gestion des licences , nous considérons les composants suivants

  • Adresse MAC
  • CPU (Pas le numéro de série, mais le profil de processeur actuel, comme pas à pas et modèle)
  • Numéro de série du lecteur système (numéro de volume non spécifié)
  • mémoire
  • modèle de CD-ROM & amp; fournisseur
  • Modèle de carte vidéo & amp; fournisseur
  • Contrôleur IDE
  • Contrôleur SCSI

Cependant, plutôt que de simplement hacher les composants et créer un système réussite / échec, nous créons un empreinte digitale comparable pouvant être utilisée pour déterminer les différences entre deux profils de machine. Si l'indice de différence est supérieur à une tolérance spécifiée, demandez à l'utilisateur de l'activer à nouveau.

Au cours des 8 dernières années, nous avons constaté que cette combinaison fonctionnait bien avec des centaines de milliers d'installations installées pour fournir un identifiant d'ordinateur unique et fiable, même pour les installations de machines virtuelles et d'OS clonés.

Je déteste être le gars qui dit: "vous ne le faites pas correctement" (Je déteste toujours ce mec;) mais ...

Doit-il être généré de manière répétée pour la machine unique? Pourriez-vous simplement attribuer l'identifiant ou créer 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, il faut en tenir compte.

S'il ne s'agit pas d'une question de confiance de la part des utilisateurs, vous pouvez simplement utiliser des adresses MAC.

Pourquoi ne pas utiliser uniquement l'identifiant unique du processeur?

Vous devriez envisager d’utiliser l’adresse MAC de la carte réseau (si elle existe). Celles-ci sont généralement uniques mais peuvent être fabriquées. J'ai utilisé un logiciel qui génère son fichier de licence en fonction de l'adresse MAC de votre adaptateur réseau. Il est donc considéré comme un moyen relativement fiable de distinguer les ordinateurs.

Pour l’une de mes applications, j’utilise le nom de l’ordinateur s’il s’agit d’un ordinateur n’appartenant pas au domaine ou le SID du compte d’ordinateur du domaine pour les ordinateurs du domaine. Mark Russinovich en parle dans ce billet, Machine SID :

  

Le dernier cas où la duplication de SID poserait un problème est le cas si une application distribuée utilisait des SID de machine pour identifier de manière unique les ordinateurs. Aucun logiciel Microsoft ne le fait et utiliser le SID de la machine de cette manière ne fonctionne pas uniquement parce que tous les contrôleurs de domaine ont le même SID de la machine. Les logiciels reposant sur des identités d'ordinateur uniques utilisent des noms d'ordinateur ou des SID de domaine d'ordinateur (le SID des comptes d'ordinateur du domaine).

Vous pouvez accéder au SID du compte d'ordinateur du domaine via LDAP ou System.DirectoryServices .

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 des propriétés que vous avez fournies, omettez des éléments tels que Nom et DriverVersion , Clockspeed , etc. éventuellement dépendant du système d'exploitation. Essayez d’afficher les mêmes informations sur les deux systèmes d’exploitation en laissant de côté celles qui diffèrent.

Une bibliothèque est disponible pour obtenir des informations spécifiques au matériel: Extracteur de numéro de série matériel (CPU, RAM, disque dur, BIOS)

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

Peut-être trichez-vous un peu, mais l'adresse MAC d'un adaptateur Ethernet de machine change rarement sans la carte mère changée ces jours-ci.

Pouvez-vous extraire un numéro de série ou un numéro de service du fabricant?

Notre boutique étant une boutique Dell, nous utilisons l’étiquette de service, propre à chaque machine, pour les identifier. Je sais que cela peut être demandé à partir du BIOS, du moins sous Linux, mais je ne sais pas comment le faire sous Windows.

J'avais une contrainte supplémentaire, j'utilisais .net express, je ne pouvais donc 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

Recherchez l'UCID pour une option. Il peut y avoir des problèmes avec les systèmes multi-processeurs.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top