see - param c# documentation




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

Cependant, j'avais tout à fait raison quant à la question de l'identifiant du 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 de commande.

L'identificateur de processeur sera identique 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 est que les utilisateurs doivent avoir la possibilité de réinitialiser l'application, au cas où le MAC change.

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

... et des dizaines d'autres et je les ai toutes étudiées.

Le problème est que certaines des réponses acceptées ont suggéré l'adresse MAC comme identifiant unique, ce qui est totalement incorrect. D'autres réponses suggèrent d'utiliser une combinaison de divers composants, ce qui semble plus logique. Toutefois, en cas d’utilisation d’une combinaison, il convient de déterminer quel composant est peu susceptible d’être modifié fréquemment. Il y a quelques jours, nous avons développé un générateur de clés pour un problème de licence logicielle. Nous avons utilisé la combinaison de CPUID et de MAC pour identifier un PC Windows de manière unique. Ironiquement, lorsque nous l'avons testé, nous avons trouvé trois ordinateurs renvoyant le même identifiant avec notre générateur de clés!

Y a-t-il vraiment un moyen d'identifier de manière unique un ordinateur? En ce moment, nous avons juste besoin de faire fonctionner notre générateur de clés sur Windows. Si possible, utiliser c # serait génial car notre système est développé sur .net.

Mettre à jour:

Désolé pour avoir créé des confusions et une fausse alerte. Nous avons découvert des erreurs dans notre méthode de récupération des informations HW. Avant tout, j'ai pensé à supprimer cette question, car ma propre confusion a disparu et je pense qu'une combinaison de deux composants ou plus est suffisante pour identifier un ordinateur. Cependant, alors j'ai décidé de le garder parce que je pense que je devrais clarifier ce qui causait le problème car la même chose pourrait blesser un autre gars à l'avenir.

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

Nous getManagementInfo une fonction getManagementInfo pour récupérer les identifiants MAC et Processor

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 l'adresse MAC

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

et récupérer ProcessorID

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

À ce stade, strMAC contiendrait plus d'une adresse MAC s'il y en a plusieurs. Pour n'en prendre qu'un, nous avons juste pris les 17 premiers caractères (12 chiffres MAC et 5 points entre).

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

C'est là que nous avons commis l'erreur. Parce que getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") un nombre d'adresses MAC supplémentaires réellement utilisées. Par exemple, lorsque nous avons recherché des adresses MAC dans l'invite de commande en getmac commande getmac cela indiquait une ou deux adresses MAC pour chaque PC, toutes différentes. Mais getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") 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 strMAC dans strMAC .

Le code suivant de Sowkot Osman fait l'affaire en retournant uniquement 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 tout à fait raison quant à la question de l'identifiant du 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 de commande.

Nous avons maintenant décidé d'utiliser le numéro de série de la carte mère au lieu de l'ID du processeur pour combiner l'adresse MAC. Je pense que notre objectif sera atteint de cette façon et que, dans certains cas, nous ne le ferons pas dans ces quelques cas.


Je suis entièrement d'accord avec le commentaire ci-dessus.

Pour la licence de logiciel, 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.


Que diriez-vous d'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();
}




uniqueidentifier