web-dev-qa-db-fra.com

Existe-t-il vraiment un moyen d'identifier de manière unique un ordinateur quelconque?

Je sais qu'il y a un certain nombre de questions similaires dans stackoverflow telles que les suivantes:

... et des dizaines d'autres et je les ai tous étudiés.

Le problème est que certaines des réponses acceptées ont suggéré l’adresse MAC comme identifiant unique, ce qui est tout à fait incorrect. Certaines autres réponses ont suggéré d'utiliser une combinaison de divers composants, ce qui semble plus logique. Cependant, en cas d'utilisation d'une combinaison, il convient de considérer quel composant est naturellement peu susceptible d'être changé fréquemment. Il y a quelques jours, nous avons développé un générateur de clé pour un problème de licence logicielle, dans lequel nous utilisions la combinaison de CPUID et de MAC pour identifier un ordinateur Windows uniquement et jusqu'à ce que des tests pratiques soient effectués, nous estimions que notre approche était satisfaisante. Ironiquement, lorsque nous l'avons testé, nous avons trouvé trois ordinateurs renvoyant le même identifiant avec notre générateur de clé!

Alors, existe-t-il vraiment un moyen d'identifier de manière unique un ordinateur? Pour le moment, nous devons simplement faire en sorte que notre générateur de clés fonctionne sur Windows PC. Une certaine manière (si possible) d’utiliser c # serait géniale car notre système est développé sur .net.

Mise à jour:

Désolé de créer des confusions et une fausse alerte apparemment. Nous avons découvert une erreur dans notre méthode de récupération des informations matérielles. En premier lieu, je pensais supprimer cette question, car ma confusion est maintenant révolue et je pense qu’une combinaison de deux composants ou plus est suffisante pour identifier un ordinateur. Cependant, j'ai ensuite décidé de le garder car je pense que je devrais clarifier la cause du problème car la même chose pourrait blesser un autre gars à l'avenir.

Voici ce que nous faisions (à l'exclusion des autres codes):

Nous utilisions une fonction getManagementInfo pour récupérer le MAC et l'ID de processeur

private String getManagementInfo(String StrKey_String, String strIndex)
    {
        String strHwInfo = null;
        try
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + StrKey_String);
            foreach (ManagementObject share in searcher.Get())
            {
                strHwInfo += share[strIndex];
            }
        }
        catch (Exception ex)
        {
            // show some error message
        }
        return strHwInfo;
    } 

Ensuite, si nécessaire, nous avons utilisé cette fonction pour récupérer une adresse MAC.

string strMAC = getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress");

et récupérer ProcessorID

string strProcessorId = getManagementInfo("Win32_Processor", "ProcessorId");

À ce stade, strMAC contiendrait plusieurs adresses MAC s'il en existait plusieurs. Pour n'en prendre qu'un, nous avons pris les 17 premiers caractères (12 chiffres MAC et 5 points entre les deux).

strMAC = strMAC.Length > 17 ? strMAC.Remove(17) : strMAC;

C'est là que nous avons commis l'erreur. Parce que getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") renvoyait un certain nombre d'adresses MAC supplémentaires réellement utilisées. Par exemple, lorsque nous avons recherché des adresses MAC dans la commande Invite par la commande getmac, une ou deux adresses MAC ont été affichées pour chaque ordinateur, lesquelles étaient toutes différentes. Mais getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") a renvoyé quatre à cinq adresses MAC, dont certaines étaient identiques pour tous les ordinateurs. Comme nous venons de prendre la première adresse MAC renvoyée par notre fonction au lieu de vérifier quoi que ce soit d’autre, les adresses MAC identiques ont été prises dans strMAC incidemment. 

Le code suivant de Sowkot Osman fait le bon choix en ne renvoyant que la première adresse MAC active/activée:

private static string macId()
    {
        return identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled");
    }

private static string identifier(string wmiClass, string wmiProperty, string wmiMustBeTrue)
    {
        string result = "";
        System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass);
        System.Management.ManagementObjectCollection moc = mc.GetInstances();
        foreach (System.Management.ManagementObject mo in moc)
        {
            if (mo[wmiMustBeTrue].ToString() == "True")
            {
                //Only get the first one
                if (result == "")
                {
                    try
                    {
                        result = mo[wmiProperty].ToString();
                        break;
                    }
                    catch
                    {
                    }
                }
            }
        }
        return result;
    }
    //Return a hardware identifier
    private static string identifier(string wmiClass, string wmiProperty)
    {
        string result = "";
        System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass);
        System.Management.ManagementObjectCollection moc = mc.GetInstances();
        foreach (System.Management.ManagementObject mo in moc)
        {
            //Only get the first one
            if (result == "")
            {
                try
                {
                    result = mo[wmiProperty].ToString();
                    break;
                }
                catch
                {
                }
            }
        }
        return result;
    }

Cependant, j'avais absolument raison à propos du même problème d'identification de processeur. Tous les trois ont renvoyé le même ID de processeur lorsque nous avons placé la commande wmic cpu get ProcessorId dans leurs invites.

Nous avons maintenant décidé d'utiliser le numéro de série de la carte mère au lieu de l'identifiant du processeur pour combiner l'adresse MAC. Je pense que notre objectif sera servi de cette façon et si ce n'est pas le cas dans certains cas, nous devrions laisser tomber cela dans ces quelques cas.

28
Sajib Mahmood

L'obtention d'un ID unique mondial est le fait que seule l'adresse MAC est l'ID qui ne changera pas si vous configurez votre système dans son intégralité. SI vous générez une clé pour un produit spécifique, la meilleure façon de le faire consiste à attribuer des ID uniques pour les produits et à combiner l'ID de produit avec l'adresse MAC. J'espère que ça aide. 

5
HUNKY_Monkey

Pourquoi ne pas ajouter le numéro de série de la carte mère, par exemple:

using System.management;


//Code for retrieving motherboard's serial number
ManagementObjectSearcher MOS = new ManagementObjectSearcher("Select * From Win32_BaseBoard");
foreach (ManagementObject getserial in MOS.Get())
{
textBox1.Text = getserial["SerialNumber"].ToString();
}

//Code for retrieving Processor's Identity
MOS = new ManagementObjectSearcher("Select * From Win32_processor");
foreach (ManagementObject getPID in MOS.Get())
{
textBox2.Text = getPID["ProcessorID"].ToString();
}

//Code for retrieving Network Adapter Configuration
MOS = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration");
foreach (ManagementObject mac in MOS.Get())
{
textBox3.Text = mac["MACAddress"].ToString();
}
11
ChrisBD

Je suis complètement d'accord avec juste le commentaire ci-dessus.

Pour l’octroi de licence logicielle, vous pouvez utiliser:

Adresse MAC de l'ordinateur (prenez tout si plusieurs cartes NIC) + votre code produit logiciel

La plupart des fournisseurs de télécommunications renommés utilisent cette technique.

2
Palash Gupta

Cependant, j'avais absolument raison à propos du même problème d'identification de processeur . Tous les trois ont renvoyé le même ID de processeur lorsque nous avons mis la commande wmic cpu Get ProcessorId dans leurs invites.

L'ID du processeur sera le même si tous les systèmes s'exécutent en tant que machines virtuelles sur le même hyperviseur.

MAC ID semble bien. La seule chose, c’est que les utilisateurs doivent avoir la possibilité de réinitialiser l’application, au cas où le MAC changerait.

1
Divyanand M S