Comment déterminer l'adresse MAC de la carte réseau physique - pas les interfaces réseau virtuelles créées par (.NET C # de) de VPN

StackOverflow https://stackoverflow.com/questions/1567377

Question

Arrière-plan

Je suis en train d'obtenir obtenir un identifiant unique d'un ordinateur et que vous voulez être en mesure de revenir de manière fiable la même adresse MAC chaque fois. Croyez-moi, j'ai mes raisons d'utiliser l'adresse MAC et avoir lu beaucoup de messages sur les autres méthodes d'identification uniques (et oui, je l'ai pris en compte si elles n'ont pas de cartes réseau).

Problème

Le problème est dans .NET je ne vois pas de toute façon de dire si un NetworkInterface spécifique est une carte réseau matériel physique de quelque chose comme un « Nortel IPSECSHM Adapter - Planificateur de paquets Miniport » qui sont ajoutés lorsque vous vous connectez à certains réseaux privés virtuels ou réseaux WiFi.

Je sais comment obtenir les adresses Mac en utilisant un code similaire à ceci:

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        log.Debug("NIC " + nic.OperationalStatus + " " + nic.NetworkInterfaceType + " " + nic.Speed + " " + nic.GetPhysicalAddress() + " " + nic.Description);
    }

Naturellement il n'y a aucun moyen de 100% pour vous assurer que je serais obtenir une carte réseau interne mais je voudrais choisir l'adresse MAC de retour qui pour une machine donnée qui est moins susceptible de changer . Indépendamment de facteurs tels que -. S'il est connecté au wifi ... via un connecté obtient le type de connexion d'attache ... ou ils installent un nouveau logiciel de vpn qui ajoute une nouvelle interface

Stratégies Considéré comme

1) Choisissez la première interface qui est "Up". Cela échoue sur mon ordinateur portable parce que le « paquet Miniport » est toujours. De plus, si j'attache mon téléphone à mon ordinateur portable cela montre aussi comme la première carte.

2) Choisissez le type le plus approprié ... Ce ne b / c fondamentalement tout apparaît comme "Ethernet" y compris les adaptateurs WiFi et mon iPhone tethering connexion Internet.

3) Choisissez la carte réseau qui a une adresse IP. Ne parvient pas pour plusieurs raisons: 1) carte réseau peut ne pas être connecté au LAN 2) Il y a plusieurs nics qui pourraient avoir des adresses IP

.

4) Il suffit d'envoyer toutes les adresses MAC ... Le problème est la liste changeraient en fonction des logiciels installés et il sera difficile de comparer.

5) Choisissez l'adresse mac avec la plus grande vitesse. Je pense que c'est probablement mon meilleur pari. Je pense qu'il est sûr de dire que le plus rapide interface va généralement être le plus permanent.

Sinon, il peut y avoir une autre façon de détecter les cartes physiques dans .NET ou j'envisager d'invoquer d'autres appels API si vous pouvez recommander un qui fournira des informations différentes.

D'autres idées?

Pour démontrer ici est la sortie de mon code exemple ci-dessus quand j'ai mon iphone tethered:

DEBUG - NIC Down Ethernet 500000     0021E98BFBEF Apple Mobile Device Ethernet - Packet Scheduler Miniport
DEBUG - NIC Up   Ethernet 10000000   444553544200 Nortel IPSECSHM Adapter - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 54000000   00166FAC94C7 Intel(R) PRO/Wireless 2200BG Network Connection - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 1000000000 0016D326E957 Broadcom NetXtreme Gigabit Ethernet - Packet Scheduler Miniport
DEBUG - NIC Up   Loopback 10000000  MS TCP Loopback interface

Sans iPhone connecté:

DEBUG - NIC Up   Ethernet 10000000   444553544200 Nortel IPSECSHM Adapter - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 54000000   00166FAC94C7 Intel(R) PRO/Wireless 2200BG Network Connection - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 1000000000 0016D326E957 Broadcom NetXtreme Gigabit Ethernet - Packet Scheduler Miniport
DEBUG - NIC Up   Loopback 10000000  MS TCP Loopback interface
Était-ce utile?

La solution

Ceci est ma méthode: il utilise le fait que la carte physique est connecté à l'interface PCI

ManagementObjectSearcher searcher = new ManagementObjectSearcher
    ("Select MACAddress,PNPDeviceID FROM Win32_NetworkAdapter WHERE MACAddress IS NOT NULL AND PNPDeviceID IS NOT NULL");
ManagementObjectCollection mObject = searcher.Get();

foreach (ManagementObject obj in mObject)
{
    string pnp = obj["PNPDeviceID"].ToString();
    if (pnp.Contains("PCI\\"))
    {
        string mac = obj["MACAddress"].ToString();
        mac = mac.Replace(":", string.Empty);
        return mac;
    }
}

Autres conseils

Les trois premiers octets de l'adresse MAC sont un identifiant du fabricant. Vous pouvez la liste noire de certains ID fabricant connus pour ne pas convenir à vos besoins, et d'ignorer ces interfaces.

En se fondant sur la vitesse ne risque pas d'être une bonne idée, parce qu'il n'y a aucune raison pour laquelle une interface VPN ne pouvait pas se déclarer comme ayant une vitesse gigabit.

Les adresses MAC sont des adresses matérielles physiques. Je ne peux pas tester sur ce PC, mais je ne pense pas que vous obtiendrez une nouvelle adresse MAC si une connexion virtuelle est ajoutée parce que ce n'est pas un vrai morceau de matériel. Ce sera une autre connexion, mais pas une autre adresse MAC.

garantissant que vous obtenez la même adresse MAC chaque fois dépend des mêmes pièces de matériel étant attaché à la machine et vous en utilisant le même algorithme pour choisir de ce matériel.

J'ai regardé ce problème aussi bien, et je crois que sans état persistant, il va être difficile de maintenir un MAC stable.

La solution que je suis jouer avec est de prendre la première carte réseau trouvée dans l'ordre d'adaptation et de l'utilisation que et enregistrez-. Puis sur les générations suivantes UUID, utilisez le MAC enregistrée si elle est trouvée nulle part dans la pile même si pas le premier. De cette façon, l'ordre de l'adaptateur peut se déplacer et nous ne vous inquiétez pas sauter tout dépend de la MAC stable (comme un module de licence).

Si le MAC enregistrée ne se trouve pas dans la pile, il est mis au rebut et nous suffit d'utiliser le premier MAC dans l'ordre de liaison et recommencer.

 public static string GetMacAddressPhysicalNetworkInterface()
    {

        ManagementObjectSearcher searcher = new ManagementObjectSearcher
        ("Select MACAddress,PNPDeviceID FROM Win32_NetworkAdapter WHERE MACAddress IS NOT NULL AND" +
         " PNPDeviceID IS NOT NULL AND" +
         " PhysicalAdapter = true");
        ManagementObjectCollection mObject = searcher.Get();

        string macs = (from ManagementObject obj in mObject
                let pnp = obj["PNPDeviceID"].ToString()
                where !(pnp.Contains("ROOT\\"))
                //where  pnp.Contains("PCI\\")  || pnp.Contains("USB\\")
                select obj).Select(obj => obj["MACAddress"].ToString())
            .Aggregate<string, string>(null, (mac, currentMac) => mac + currentMac.Replace(":", string.Empty) + ",");

        return !string.IsNullOrEmpty(macs) ? macs.Substring(0, macs.Length - 1) : macs;
    }

    public static NetworkInterface GetPhysicalNetworkInterface(string macAddressPhysicalNetworkInterface)
    {
        return NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(currentNetworkInterface => string.Equals(currentNetworkInterface.GetPhysicalAddress().ToString(), macAddressPhysicalNetworkInterface, StringComparison.CurrentCultureIgnoreCase));
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top