La génération d'une machine unique id
J'ai besoin d'écrire une fonction qui génère un id qui est unique pour un ordinateur exécutant un système d'exploitation Windows.
Actuellement, je suis à l'aide de WMI à la requête de divers paramètres matériels et de les enchaîner ensemble et de hachage pour obtenir l'id unique. Ma question est, quels sont les paramètres suggérés que je devrais utiliser?
Actuellement, je suis en utilisant une combinaison de bios\cpu\disque de données pour générer l'id unique. Et je suis en utilisant le premier résultat si plusieurs résultats sont là pour chaque métrique.
Cependant, j'ai couru dans un problème où une machine à double bottes en 2 différents système d'exploitation Windows génère différents codes de site sur chaque OS, qui, idéalement, devrait pas arriver.
De référence, ce sont les paramètres 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
Vous devez vous connecter pour publier un commentaire.
Analyser le SMBIOS vous-même et de hachage à une longueur arbitraire. Voir la Spécification PDF pour tous SMBIOS structures disponibles.
Pour interroger le SMBIOS info à partir de Windows vous pouvez utiliser
EnumSystemFirmwareEntries
,EnumSystemFirmwareTables
etGetSystemFirmwareTable
.IIRC, le "identifiant unique" de l'instruction CPUID est déconseillé de P3 et les plus récents.
closeEnough
fonction pour que j'accepte une non-correspondance des id si elle ne variaient dans les 2 champs. J'ai également inclure des informations sur le processeur et le système de disque dur dans mon hachage car dès le début j'ai eu des collisions entre des systèmes identiques.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 registreHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
, comme @Agnus suggéré. Il est généré lors de l'installation de l'OS et ne changera pas, sauf si vous faites un autre fraîches installation du système d'exploitation. Selon la version de l'OS peut contenir le réseau adresse MAC de l'adaptateur intégré (plus quelques autres numéros, y compris au hasard), ou un nombre pseudo-aléatoire, le plus tard pour les nouvelles versions de système d'exploitation (après XP SP2, je crois, mais pas sûr). Si c'est un pseudo, théoriquement, il peut être forgé - si deux machines ont le même état initial, y compris l'horloge en temps réel. Dans la pratique, ce seront rares, mais sachez que si vous vous attendez à être une base pour la sécurité qui peuvent être attaqués par les pirates.Bien sûr une entrée de registre peut également être facilement changé par n'importe qui pour se forger une machine GUID, mais ce que j'ai trouvé, c'est que ce serait nuire au fonctionnement normal de nombreux composants de Windows que, dans la plupart des cas, aucun utilisateur normal le ferait (encore une fois, regarder dehors pour les hardcore pirates).
Avec notre outil gestionnaire de licences nous considérons les éléments suivants
Cependant, plutôt que de simplement le hachage et composants de la création d'un pass/fail système, nous allons créer un comparable d'empreintes digitales qui peut être utilisé pour déterminer comment les différentes deux machine profils sont. Si la différence de notation est au-dessus d'une tolérance spécifiée, puis demander à l'utilisateur de l'activer de nouveau.
Nous avons trouvé au cours des 8 dernières années dans l'utilisation avec des centaines de milliers d'utilisateur installe que cette combinaison fonctionne bien pour fournir de manière fiable unique de la machine id - même pour les machines virtuelles et cloné OS installe.
Je déteste être le gars qui a dit, "vous êtes juste de faire le mal" (je déteste ce mec 😉 mais...
- T-il renouvelable générée par la unique de la machine? Pourriez-vous attribuer l'identifiant ou faire une clé publique/privée? Peut-être que si vous pouvez générer et de stocker de la valeur, vous pourriez accéder à partir de deux OS s'installe sur le même disque?
Vous avez probablement exploré ces options et ils ne fonctionnent pas pour vous, mais si non, c'est quelque chose à considérer.
Si ce n'est pas une question de confiance des utilisateurs, vous pouvez simplement utiliser les adresses MAC.
Qu'en utilisant simplement l'id unique du processeur?
Vous devriez regarder dans l'aide de l'adresse MAC de la carte réseau (si elle existe). Ceux-ci sont généralement unique, mais peuvent être fabriqués. J'ai utilisé un logiciel qui génère son fichier de licence basé sur votre réseau adresse MAC de la carte, il est donc considéré comme un assez moyen fiable de distinguer entre les ordinateurs.
Pour l'une de mes applications, j'ai utiliser le nom de l'ordinateur si elle n'est pas de domaine de l'ordinateur, ou le domaine de la machine SID du compte pour les ordinateurs du domaine. Mark Russinovich en parle dans ce blog, Machine SID:
Vous pouvez accéder au domaine de la machine SID du compte via LDAP ou
System.DirectoryServices
.Dans mon programme, j'ai d'abord vérifier pour le Serveur Terminal server et utiliser le WTSClientHardwareId. Le reste de l'adresse MAC du PC local devrait être suffisant.
Si vous voulez vraiment utiliser la liste de propriétés que vous avez prévu de sortir des choses comme
Name
etDriverVersion
,Clockspeed
, etc. car c'est peut-être OS dépendante. Essayez de reproduire les mêmes infos sur les deux systèmes d'exploitation et de laisser ce qui diffère entre les deux.Il y a une bibliothèque à disposition pour l'obtention de matériel spécifique d'informations: Numéro de série matériel de l'extracteur (CPU, RAM, disque dur, le BIOS)
Pourquoi ne pas utiliser l'adresse MAC de votre carte réseau?
Peut-être de la triche un peu, mais l'Adresse MAC d'une des machines de l'adaptateur Ethernet de change rarement sans la carte mère de la modification de ces jours.
Pouvez-vous tirer de certains type de fabricant numéro de série ou l'étiquette de service?
Notre boutique est une boutique Dell, donc nous utilisons le service de la balise qui est unique pour chaque machine afin de les identifier. Je sais qu'elle peut être interrogée à partir du BIOS, au moins sous Linux, mais je ne sais pas désinvolte comment le faire dans Windows.
J'avais une contrainte supplémentaire, j'ai été en utilisant .net express donc je ne pouvais pas utiliser le matériel standard mécanisme de requête. J'ai donc décidé d'utiliser la puissance de shell pour faire la requête. Le code ressemble à ceci:
Rechercher CPUID pour une option. Il pourrait y avoir quelques problèmes avec le multi-processeurs.
Essayer celui-ci, il donne un disque dur unique ID: Port de DiskId32 pour Delphi 7-2010.