web-dev-qa-db-fra.com

Qu'est-ce qu'un bon identifiant unique de PC?

Je suis en train de regarder le code dans ce tutoriel , et j’ai constaté qu’il utilise My.Computer.Name pour enregistrer les paramètres qui ne devraient pas être déplacés entre ordinateurs. Cependant, il est tout à fait possible qu'un utilisateur dispose de deux ordinateurs portant le même nom. S'ils veulent avoir le même nom d'utilisateur sur chaque PC, par exemple, ils peuvent très bien se retrouver avec deux ordinateurs nommés Nom d'utilisateur-PC.

Quelles sont les bonnes méthodes pour identifier différents PC? Est-ce que les ordinateurs sont associés à des GUID, ou dois-je envisager d'extraire le numéro de série d'un matériel? Peu m'importe si l'identification persiste après la réinstallation de Windows.

(Le tutoriel que j'ai lié est en VB.Net, mais je l'implémente en C #)

40
dlras2

Quelques bons identifiants:

  • Adresse MAC: Il est assez facile d’y accéder, et c’est généralement unique. Cependant, il peut être usurpé/modifié assez facilement, cela dépend donc de la spécificité dont il a besoin.
  • Numéro de série du processeur: il n'est pas disponible sur de nombreux systèmes plus anciens, mais il existe. Découvrez cette page MSDN . Cela ne changera pas, mais c'est lié à un ordinateur.
  • Numéro de série du disque dur: il est probable que cela ne change pas, mais cela peut être une nuisance en cas de panne du disque dur Découvrez cette page MSDN .
40
mattbasta

Si vous êtes sur Windows, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId est unique par machine/par installation de Windows. où, comme dans certaines des autres réponses telles que l'adresse MAC, Proc SN et HD SN resteront les mêmes entre les situations Windows réinstallées/à double démarrage.

18
Scott Chamberlain

La vraie réponse à cette question: il n'y a pas une telle chose.

Il existe plusieurs solutions "assez proches", mais chacune d’elles a sa propre limitation.

Tous les identifiants matériels - Modifications matérielles. Et, dans de nombreux cas, vous pouvez modifier ces identificateurs (par exemple, l'usurpation d'adresse MAC).

Comme je l'ai déjà mentionné, le SID n'est pas très bon, car le SID ne changera pas si l'ordinateur a été installé à partir d'une image. Le SID est généré par l'installation de Windows. Si Windows n'a pas été installé, mais copié à partir d'une image, il ne changera pas (bien qu'il soit courant de le régénérer à cause d'un mythe sur le "risque de sécurité" - vous ne pouvez pas compter sur ça).

Nom de l'ordinateur - Eh bien, comme mentionné, ils supposent être uniques, mais ils ne sont en aucun cas appliqués.

Une autre solution que vous pouvez implémenter consiste à générer votre propre identifiant unique et à le stocker localement (en supposant que vous puissiez le faire). Encore une fois, cette solution ne fonctionnera pas si votre ordinateur a été imagé avec votre application.

La meilleure solution pour vous dépend vraiment de ce que vous essayez d'accomplir. J'ai eu le même problème avec un réseau assez grand, et la meilleure solution dans mon cas était le nom de l'ordinateur. Si vous êtes absolument certain que votre processus ne sera pas imagé, je générerais un identifiant unique en utilisant Guid car ce sera probablement le plus sûr.

11
DiGMi

Voici un moyen d'identifier de manière unique un ordinateur . À l'aide de System.Management pour obtenir Win32_BIOS, vous pouvez obtenir des valeurs uniques à partir du BIOS de votre ordinateur.

Voir: Classe Win32_BIOS, http://msdn.Microsoft.com/en-us/library/aa394077.aspx

using System.Management;

string UniqueMachineId()
{
    StringBuilder builder = new StringBuilder();

    String query = "SELECT * FROM Win32_BIOS";
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    //  This should only find one
    foreach (ManagementObject item in searcher.Get())
    {
        Object obj = item["Manufacturer"];
        builder.Append(Convert.ToString(obj));
        builder.Append(':');
        obj = item["SerialNumber"];
        builder.Append(Convert.ToString(obj));
    }

return builder.ToString();
}

Avec une logique similaire, vous pouvez également naviguer dans "Win32_DiskDrive"; http://msdn.Microsoft.com/en-us/library/aa394132.aspx ; lecteur physique. Dans ce cas, le 

    foreach (ManagementObject item in searcher.Get())

devrait trouver plusieurs objets

9
andrewmcc

Prenons trois identifiants semi-uniques et semi-constants. Utilisez la règle selon laquelle 2 sur 3 suffisent pour une identification positive. Mettez à jour les données enregistrées pour le 1 sur 3 qui est parfois erroné. 

3
Tomminn

Utilisez l'adresse MAC de la carte réseau. C'est supposé être unique. Cela peut être changé, cependant. Cela dépend de la malveillance que vous attendez de vos utilisateurs et de la gravité de votre application.

Quelques exemples de code pour le faire:

public string GetMACAddress() {
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc = mc.GetInstances();

    string MACAddress = String.Empty;

    foreach (ManagementObject mo in moc) {
        if (MACAddress == String.Empty) { // only return MAC Address from first card
            if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
        }
        mo.Dispose();
    }

    return MACAddress;
}
2
MicSim

Une chose que vous pouvez utiliser est le MAC de n'importe quelle interface réseau. Vous pouvez également combiner plusieurs sources d'informations. Comme le numéro de série du disque dur, mac, type de processeur pour en calculer le hachage.

1
schoetbi

Je ne pense pas qu'il soit possible d'avoir deux PC portant le même nom sur le même domaine. Avez-vous essayé de capturer le nom de domaine?

0
user279521

Jetez un coup d'oeil ici: Obtenir le numéro de série de Dell Machine en utilisant .net?

Vous pouvez extraire des données uniques du registre.

0
JonH

Chaque ordinateur a un SID unique dans des circonstances normales.

0
Steven Sudit