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