21 Stimmen

Ermittlung der MAC-Adresse der tatsächlichen physischen Netzwerkkarte - nicht der von VPNs erstellten virtuellen Netzwerkschnittstellen (.NET C#)

Hintergrund

Ich versuche, von einem Computer eine eindeutige Kennung zu erhalten, und möchte in der Lage sein, jedes Mal zuverlässig dieselbe MAC-Adresse zurückzugeben. Glauben Sie mir, ich habe meine Gründe für die Verwendung der MAC-Adresse und habe viele Beiträge über alternative eindeutige ID-Methoden gelesen (und ja, ich habe in Betracht gezogen, wenn sie keine Netzwerkkarten haben).

Problem

Das Problem ist, dass ich in .NET nicht erkennen kann, ob es sich bei einem bestimmten NetworkInterface um eine physische Hardware-Netzwerkkarte oder um einen "Nortel IPSECSHM Adapter - Packet Scheduler Miniport" handelt, der hinzugefügt wird, wenn man sich mit bestimmten VPNs oder WiFi-Netzwerken verbindet.

Ich weiß, wie man die Mac-Adressen mit einem ähnlichen Code wie diesem abrufen kann:

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

Verständlicherweise kann man nicht 100%ig sicher sein, dass ich eine interne Netzwerkkarte bekomme, aber Ich möchte die MAC-Adresse auswählen, die für eine bestimmte Maschine zurückgegeben werden soll und die sich am wenigsten wahrscheinlich ändert. . Unabhängig von Faktoren wie - ob es mit WiFi verbunden ist... wird über eine Art von Tether-Verbindung verbunden... oder sie installieren einige neue vpn Software, die eine neue Schnittstelle hinzufügt.

Geprüfte Strategien

1) Wählen Sie die erste Schnittstelle, die "Up" ist. Dies schlägt auf meinem Laptop fehl, da der "Packet Miniport" immer aktiv ist. Wenn ich mein Telefon mit meinem Laptop verbinde, wird dies auch als erste Karte angezeigt.

2) Wählen Sie den am besten geeigneten Typ... Dies schlägt fehl, weil im Grunde alles als "Ethernet" angezeigt wird, einschließlich WiFi-Adapter und meine iPHone-Tethering-Internetverbindung.

3) Wählen Sie die Netzwerkkarte, die eine IP-Adresse hat. Scheitert aus mehreren Gründen: 1) Die Netzwerkkarte ist möglicherweise nicht mit dem LAN verbunden 2) Es gibt mehrere Netzwerkkarten, die IP-Adressen haben können.

4) Senden Sie einfach alle MAC-Adressen... Das Problem ist, dass sich die Liste je nach installierter Software ändern würde und es schwierig wäre, sie zu vergleichen.

5) Wählen Sie die Mac-Adresse mit der schnellsten Geschwindigkeit. Ich denke, das ist wahrscheinlich die beste Wahl. Ich denke, man kann mit Sicherheit sagen, dass die schnellste Schnittstelle in der Regel auch die dauerhafteste ist.

Vielleicht gibt es aber auch eine andere Möglichkeit, physische Karten in .NET zu erkennen, oder ich würde andere API-Aufrufe in Betracht ziehen, wenn Sie einen empfehlen können, der andere Informationen liefert.

Haben Sie eine andere Idee?

Um zu demonstrieren, hier ist die Ausgabe von meinem Beispielcode oben, wenn ich mein iPhone angebunden haben:

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

Ohne angeschlossenes Iphone:

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

12voto

Sergey Punkte 136

Das ist meine Methode: Sie nutzt die Tatsache, dass die physische Karte an die PCI-Schnittstelle angeschlossen ist.

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;
    }
}

2voto

caf Punkte 224189

Die ersten drei Bytes der MAC-Adresse sind eine Hersteller-ID. Sie können bestimmte Hersteller-IDs, die für Ihre Zwecke ungeeignet sind, auf eine schwarze Liste setzen und diese Schnittstellen ignorieren.

Sich auf die Geschwindigkeit zu verlassen, ist wahrscheinlich keine gute Idee, denn es gibt keinen Grund, warum eine VPN-Schnittstelle sich nicht selbst als Gigabit-Geschwindigkeit melden könnte.

0voto

Brian Punkte 997

MAC-Adressen sind physikalische Hardware-Adressen. Ich kann es auf diesem PC nicht testen, aber ich glaube nicht, dass Sie eine neue MAC-Adresse erhalten, wenn eine virtuelle Verbindung hinzugefügt wird, da es sich nicht um ein tatsächliches Stück Hardware handelt. Es wird eine andere Verbindung sein, aber keine andere MAC-Adresse.

Um zu gewährleisten, dass Sie jedes Mal dieselbe MAC-Adresse erhalten, muss dieselbe Hardware an den Rechner angeschlossen sein und Sie müssen denselben Algorithmus für die Auswahl dieser Hardware verwenden.

0voto

Steve Friedl Punkte 3659

Ich habe mich auch mit diesem Problem befasst und glaube, dass es ohne einen dauerhaften Zustand schwierig sein wird, einen MAC stabil zu halten.

Die Lösung, mit der ich spiele, ist, die erste in der Adapterreihenfolge gefundene NIC zu nehmen und diese zu verwenden und speichern Sie es . Bei nachfolgenden UUID-Generationen wird dann die gespeicherte MAC verwendet, wenn sie irgendwo im Stapel gefunden wird, auch wenn es nicht die erste ist. Auf diese Weise kann sich die Reihenfolge der Adapter verschieben und wir brauchen uns keine Sorgen zu machen, dass irgendetwas, das vom stabilen MAC abhängt (wie z.B. ein Lizenzierungsmodul), in die Luft fliegt.

Wenn der gespeicherte MAC nicht im Stapel gefunden wird, wird er verworfen, und wir verwenden einfach den ersten MAC in der Bindungsreihenfolge und beginnen von vorne.

0voto

reza.Nikmaram Punkte 119
 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));
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X