Ich brauche eine Möglichkeit, die MAC-Adresse eines Computers zu ermitteln, unabhängig davon, welches Betriebssystem mit C # ausgeführt wird. Die Anwendung muss unter XP / Vista / Win7 32 und 64 Bit sowie auf diesen Betriebssystemen funktionieren, jedoch mit einer fremdsprachigen Standardeinstellung. Viele der C # -Befehle und Betriebssystemabfragen funktionieren nicht betriebssystemübergreifend. Irgendwelche Ideen? Ich habe die Ausgabe von "ipconfig / all" abgekratzt, aber dies ist schrecklich unzuverlässig, da das Ausgabeformat auf jedem Computer unterschiedlich ist.
Vielen Dank
Antworten:
Sauberere Lösung
Oder:
quelle
return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();
(Wenn es nicht dein Ding ist, sollte es dein Ding sein.)var networks = NetworkInterface.GetAllNetworkInterfaces(); var activeNetworks = networks.Where(ni => ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback); var sortedNetworks = activeNetworks.OrderByDescending(ni => ni.Speed); return sortedNetworks.First().GetPhysicalAddress().ToString();
FirstOrDefault
vor dem Finale anrufenSelect
. Auf diese Weise wird nur die physische Adresse abgerufen und für die tatsächlich erhaltene Adresse serialisiertNetworkInterface
. Vergessen Sie nicht, den Null-Check (?) Nach demFirstOrDefault
.NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Hier ist ein C # -Code, der die MAC-Adresse der ersten betriebsbereiten Netzwerkschnittstelle zurückgibt. Angenommen, die
NetworkInterface
Assembly ist in der Laufzeit (dh Mono) implementiert, die auf anderen Betriebssystemen verwendet wird, dann würde dies auf anderen Betriebssystemen funktionieren.Neue Version: Gibt die Netzwerkkarte mit der schnellsten Geschwindigkeit zurück, die auch eine gültige MAC-Adresse hat.
Originalversion: Gibt nur die erste zurück.
Das einzige, was mir an diesem Ansatz nicht gefällt, ist, wenn Sie einen Nortel Packet Miniport oder eine Art VPN-Verbindung mögen, die möglicherweise ausgewählt werden kann. Soweit ich das beurteilen kann, gibt es keine Möglichkeit, den MAC eines tatsächlichen physischen Geräts von einer Art virtueller Netzwerkschnittstelle zu unterscheiden.
quelle
using System.Net.NetworkInformation;
Mit der MACAddress- Eigenschaft der WMI-Klasse Win32_NetworkAdapterConfiguration können Sie die MAC-Adresse eines Adapters angeben . (System.Management-Namespace)
Wenn Sie mit der WMI-API (Windows Management Instrumentation) nicht vertraut sind, finden Sie hier eine gute Übersicht für .NET-Apps.
WMI ist für alle Windows-Versionen mit der .NET-Laufzeit verfügbar.
Hier ist ein Codebeispiel:
quelle
WMI ist die beste Lösung, wenn es sich bei dem Computer, mit dem Sie eine Verbindung herstellen, um einen Windows-Computer handelt. Wenn Sie jedoch einen Linux-, Mac- oder einen anderen Netzwerkadaptertyp verwenden, müssen Sie etwas anderes verwenden. Hier sind einige Optionen:
Hier ist ein Beispiel von Punkt 3. Dies scheint die beste Option zu sein, wenn WMI keine praktikable Lösung ist:
Dies ist die Grundlage für diesen Code: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#
quelle
Wir verwenden WMI, um die Mac-Adresse der Schnittstelle mit der niedrigsten Metrik zu erhalten, z. B. werden die Schnittstellenfenster diese bevorzugen:
Oder in Silverlight (braucht erhöhtes Vertrauen):
quelle
quelle
IMHO ist die Rückgabe der ersten Mac-Adresse keine gute Idee, insbesondere wenn virtuelle Maschinen gehostet werden. Daher überprüfe ich die Summe der gesendeten / empfangenen Bytes und wähle die am häufigsten verwendete Verbindung aus. Das ist nicht perfekt, sollte aber 9/10 Mal korrekt sein.
quelle
Diese Methode ermittelt die MAC-Adresse der Netzwerkschnittstelle, die für die Verbindung mit der angegebenen URL und dem angegebenen Port verwendet wird.
Alle Antworten hier sind nicht in der Lage, dieses Ziel zu erreichen.
Ich habe diese Antwort vor Jahren (2014) geschrieben. Also habe ich beschlossen, es ein wenig "Facelifting" zu geben. Bitte schauen Sie sich den Update-Bereich an
Um es aufzurufen, müssen Sie eine URL übergeben, mit der Sie eine Verbindung herstellen können:
Sie können auch eine Portnummer angeben. Wenn nicht angegeben, ist der Standardwert 80.
AKTUALISIERUNG:
2020
quelle
Sie könnten sich für die NIC-ID entscheiden:
Es ist nicht die MAC-Adresse, aber es ist eine eindeutige Kennung, wenn Sie danach suchen.
quelle
Ich mag die Lösung von AVee mit der niedrigsten IP-Verbindungsmetrik sehr! Wenn jedoch eine zweite NIC mit derselben Metrik installiert ist, kann der MAC-Vergleich fehlschlagen ...
Besser speichern Sie die Beschreibung der Schnittstelle mit dem MAC. In späteren Vergleichen können Sie anhand dieser Zeichenfolge das richtige Nic identifizieren. Hier ist ein Beispielcode:
quelle
Angenommen, ich habe eine TcpConnection mit meiner lokalen IP-Adresse 192.168.0.182. Wenn ich dann die Mac-Adresse dieser Netzwerkkarte wissen möchte, rufe ich die Methode wie folgt auf:
GetMacAddressUsedByIp("192.168.0.182")
quelle
Ich hasse es wirklich, diesen alten Beitrag auszugraben, aber ich denke, die Frage verdient eine andere Antwort speziell für Windows 8-10.
Verwenden von NetworkInformation aus Windows.Networking.Connectivity Namespace können Sie des Netzwerkadapters , verwendet. Dann können Sie die Schnittstellen-MAC-Adresse von den zuvor erwähnten GetAllNetworkInterfaces () erhalten.
Dies funktioniert in Windows Store-Apps nicht, da NetworkInterface in System.Net.NetworkInformation GetAllNetworkInterfaces nicht verfügbar macht.
quelle
quelle
Blak3r seinen Code ein wenig geändert. Falls Sie zwei Adapter mit der gleichen Geschwindigkeit haben. Nach MAC sortieren, sodass Sie immer den gleichen Wert erhalten.
quelle
quelle
ipconfig.exe
wird mithilfe verschiedener DLLs implementiert, einschließlichiphlpapi.dll
... Durch Googeln wirdiphlpapi
eine entsprechende Win32-API angezeigt , die in MSDN dokumentiert ist.quelle
Versuche dies:
quelle