J'ai besoin d'écrire une fonction qui génère un identifiant 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, les concaténer et les hacher pour obtenir 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 là pour chaque 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 se produire.
Pour référence, voici 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
closeEnough
fonction pour que j'accepte un identifiant non correspondant s'il ne variait que dans 2 champs. J'inclus également des détails sur le processeur et le disque dur du système dans mon hachage car au début, j'ai eu des collisions entre des systèmes identiques.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 registreHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
, comme @Agnus l'a 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 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 nombres, y compris aléatoires), ou un numéro pseudo-aléatoire, le plus tard pour les versions de système d'exploitation plus récentes (après XP SP2, je crois, mais pas sûr). S'il s'agit d'un pseudo-aléatoire 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 que ce soit une base de sécurité pouvant être attaquée par des hackers hardcore.Bien sûr, une entrée de registre peut également être facilement modifiée par n'importe qui pour forger un GUID 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, faites attention pour les hackers hardcore).
la source
Avec notre outil de licence, nous considérons les composants suivants
Cependant, plutôt que de simplement hacher les composants et de créer un système réussite / échec, nous créons une empreinte digitale comparable qui peut être utilisée pour déterminer à quel point deux profils de machine sont différents. Si le taux de différence est supérieur à une tolérance spécifiée, demandez à l'utilisateur de l'activer à nouveau.
Nous avons constaté au cours des 8 dernières années, en cours d'utilisation avec des centaines de milliers d'installations d'utilisateurs finaux, que cette combinaison fonctionne bien pour fournir un identifiant de machine unique et fiable, même pour les machines virtuelles et les installations de système d'exploitation clonées.
la source
Qu'en est-il simplement de l'utilisation de l'identifiant unique du processeur?
la source
Je déteste être le gars qui dit, "tu fais 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 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, c'est quelque chose à considérer.
Si ce n'est pas une question de confiance des utilisateurs, vous pouvez simplement utiliser des adresses MAC.
la source
Vous devriez examiner l'utilisation de 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 distinguer les ordinateurs.
la source
Pour l'une de mes applications, j'utilise soit le nom de l'ordinateur s'il ne s'agit pas d'un ordinateur de domaine, soit le SID du compte d'ordinateur de domaine pour les ordinateurs de domaine. Mark Russinovich en parle dans ce billet de blog, Machine SID :
Vous pouvez accéder au SID du compte d'ordinateur du domaine via LDAP ou
System.DirectoryServices
.la source
Dans mon programme, je vérifie d'abord Terminal Server et j'utilise 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 fourni un congé des choses comme
Name
etDriverVersion
,Clockspeed
, etc. , car il est peut - être OS dépendant. Essayez de sortir les mêmes informations sur les deux systèmes d'exploitation et laissez de côté celles qui diffèrent entre elles.la source
Il existe une bibliothèque disponible pour obtenir des informations spécifiques au matériel: Extracteur de numéro de série du matériel (CPU, RAM, HDD, BIOS)
la source
Pourquoi ne pas utiliser l'adresse MAC de votre carte réseau?
la source
Peut-être tricher un peu, mais l'adresse MAC d'un adaptateur Ethernet d'une machine change rarement sans que la carte mère ne change ces jours-ci.
la source
Pouvez-vous extraire 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 qui est unique à chaque machine pour les identifier. Je sais que cela peut être interrogé à partir du BIOS, au moins sous Linux, mais je ne sais pas comment le faire sous Windows.
la source
J'avais une contrainte supplémentaire, j'utilisais .net express donc je ne pouvais pas utiliser le mécanisme de requête matériel standard. J'ai donc décidé d'utiliser Power Shell pour faire la requête. Le code complet ressemble à ceci:
la source
Recherchez CPUID pour une option. Il peut y avoir des problèmes avec les systèmes multi-processeurs.
la source
Essayez celui-ci, il donne un ID de disque dur unique: Port de DiskId32 pour Delphi 7-2010 .
la source