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 #)
Quelques bons identifiants:
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.
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.
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
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é.
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;
}
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.
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?
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.
Chaque ordinateur a un SID unique dans des circonstances normales.