Zuverlässige Methode zum Abrufen der MAC-Adresse des Computers in C #

131

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


quelle
7
Wenn Sie betriebssystemübergreifend sagen, meinen Sie damit unterschiedliche Microsoft-Betriebssysteme?
John Weldon

Antworten:

136

Sauberere Lösung

var macAddr = 
    (
        from nic in NetworkInterface.GetAllNetworkInterfaces()
        where nic.OperationalStatus == OperationalStatus.Up
        select nic.GetPhysicalAddress().ToString()
    ).FirstOrDefault();

Oder:

String firstMacAddress = NetworkInterface
    .GetAllNetworkInterfaces()
    .Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback )
    .Select( nic => nic.GetPhysicalAddress().ToString() )
    .FirstOrDefault();
Mohammed A. Fadil
quelle
44
Oder Lambda, wenn das dein Ding ist! 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.)
GONeale
7
Prägnanter Weg, um am schnellsten zu werden: 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();
Graham Laight
1
Die erste Auswahl ist nicht immer die beste Option. Auswahl der am häufigsten verwendeten Verbindung: stackoverflow.com/a/51821927/3667
Ramunas
Optimierungshinweis: Sie können FirstOrDefaultvor dem Finale anrufen Select. Auf diese Weise wird nur die physische Adresse abgerufen und für die tatsächlich erhaltene Adresse serialisiert NetworkInterface. Vergessen Sie nicht, den Null-Check (?) Nach dem FirstOrDefault.
GregaMohorko
Um dies schneller zu erreichen, müssen Sie nicht alle Netzwerke bewerten, die der angegebenen Bedingung entsprechen. Sie benötigen nur das erste: NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Alessandro Muzzi
80

Hier ist ein C # -Code, der die MAC-Adresse der ersten betriebsbereiten Netzwerkschnittstelle zurückgibt. Angenommen, dieNetworkInterface 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.

/// <summary>
/// Finds the MAC address of the NIC with maximum speed.
/// </summary>
/// <returns>The MAC address.</returns>
private string GetMacAddress()
{
    const int MIN_MAC_ADDR_LENGTH = 12;
    string macAddress = string.Empty;
    long maxSpeed = -1;

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        log.Debug(
            "Found MAC Address: " + nic.GetPhysicalAddress() +
            " Type: " + nic.NetworkInterfaceType);

        string tempMac = nic.GetPhysicalAddress().ToString();
        if (nic.Speed > maxSpeed &&
            !string.IsNullOrEmpty(tempMac) &&
            tempMac.Length >= MIN_MAC_ADDR_LENGTH)
        {
            log.Debug("New Max Speed = " + nic.Speed + ", MAC: " + tempMac);
            maxSpeed = nic.Speed;
            macAddress = tempMac;
        }
    }

    return macAddress;
}

Originalversion: Gibt nur die erste zurück.

/// <summary>
/// Finds the MAC address of the first operation NIC found.
/// </summary>
/// <returns>The MAC address.</returns>
private string GetMacAddress()
{
    string macAddresses = string.Empty;

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
        {
            macAddresses += nic.GetPhysicalAddress().ToString();
            break;
        }
    }

    return macAddresses;
}

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.

blak3r
quelle
6
Wählen Sie nicht nur die erste Betriebsschnittstelle aus. Dies könnte Loopback-Schnittstellen, gelegentlich angeschlossene 3G-Karten usw. zurückgeben, die wahrscheinlich nicht Ihren Wünschen entsprechen. Der NetworkInterfaceType ( msdn.microsoft.com/en-us/library/… ) bietet Ihnen weitere Informationen zur NetworkInterface-Verbindung, damit Sie eine fundiertere Auswahl treffen können. Beachten Sie auch, dass auf einer Maschine möglicherweise viele aktive Verbindungen vorhanden sind und deren Reihenfolge möglicherweise nicht vorhersehbar ist.
Dave R.
@ DaveR. Ich habe mir NetworkInterfaceType angesehen, es gibt im Grunde fast immer Ethernet zurück, selbst wenn es meiner Erfahrung nach ein virtueller Adapter war, also fand ich es ziemlich nutzlos.
Blak3r
1
Sie sollten die Schnittstelle mit der niedrigsten GatewayMetric auswählen. Dies sollte die Verbindung sein, die die "schnellste, zuverlässigste oder am wenigsten ressourcenintensive Route" hat. Grundsätzlich erhalten Sie die Benutzeroberfläche, die Windows bevorzugt verwendet. Ich denke jedoch, dass Sie WMI benötigen, um das tatsächlich zu bekommen. Ich werde sehen, ob ich das zum
Laufen bringen
6
Der Vollständigkeit using System.Net.NetworkInformation;
halber
1
FWIW, wenn Sie eine Gigabit-Netzwerkkarte und Hyper-V installiert haben, haben Sie auch eine virtuelle 10-Gigabit-Netzwerkkarte. :) Schwieriges Problem zu lösen ...
Christopher Painter
10

Mit der MACAddress- Eigenschaft der WMI-Klasse Win32_NetworkAdapterConfiguration können Sie die MAC-Adresse eines Adapters angeben . (System.Management-Namespace)

MACAddress

    Data type: string
    Access type: Read-only

    Media Access Control (MAC) address of the network adapter. A MAC address is assigned by the manufacturer to uniquely identify the network adapter.

    Example: "00:80:C7:8F:6C:96"

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:

System.Management.ManagementClass mc = default(System.Management.ManagementClass);
ManagementObject mo = default(ManagementObject);
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");

ManagementObjectCollection moc = mc.GetInstances();
    foreach (var mo in moc) {
        if (mo.Item("IPEnabled") == true) {
              Adapter.Items.Add("MAC " + mo.Item("MacAddress").ToString());
         }
     }
Bayard Randel
quelle
9

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:

  1. Verwenden Sie den DOS-Befehl nbtstat -a. Erstellen Sie einen Prozess, rufen Sie diesen Befehl auf und analysieren Sie die Ausgabe.
  2. Pingen Sie zuerst die IP-Adresse, um sicherzustellen, dass Ihre Netzwerkkarte den Befehl in der ARP-Tabelle zwischenspeichert, und verwenden Sie dann den DOS-Befehl arp -a. Analysieren Sie die Ausgabe des Prozesses wie in Option 1.
  3. Verwenden Sie einen gefürchteten, nicht verwalteten Aufruf, um in der Datei iphlpapi.dll zu senden

Hier ist ein Beispiel von Punkt 3. Dies scheint die beste Option zu sein, wenn WMI keine praktikable Lösung ist:

using System.Runtime.InteropServices;
...
[DllImport("iphlpapi.dll", ExactSpelling = true)]
        public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
...
private string GetMacUsingARP(string IPAddr)
{
    IPAddress IP = IPAddress.Parse(IPAddr);
    byte[] macAddr = new byte[6];
    uint macAddrLen = (uint)macAddr.Length;

    if (SendARP((int)IP.Address, 0, macAddr, ref macAddrLen) != 0)
        throw new Exception("ARP command failed");

    string[] str = new string[(int)macAddrLen];
    for (int i = 0; i < macAddrLen; i++)
        str[i] = macAddr[i].ToString("x2");

    return string.Join(":", str);
}

Dies ist die Grundlage für diesen Code: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#

Brian Duncan
quelle
Ich suchte das Gleiche wie das OP und genau das brauchte ich!
QueueHammer
In den Optionen 1 und 2 meinen Sie DOS-Befehle, wenn Sie sich auf einem Windows-Computer befinden, und den entsprechenden Befehl unter Linux oder Mac, oder?
Raikol Amaro
8

Wir verwenden WMI, um die Mac-Adresse der Schnittstelle mit der niedrigsten Metrik zu erhalten, z. B. werden die Schnittstellenfenster diese bevorzugen:

public static string GetMACAddress()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
    IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
    string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
    return mac;
}

Oder in Silverlight (braucht erhöhtes Vertrauen):

public static string GetMACAddress()
{
    string mac = null;
    if ((Application.Current.IsRunningOutOfBrowser) && (Application.Current.HasElevatedPermissions) && (AutomationFactory.IsAvailable))
    {
        dynamic sWbemLocator = AutomationFactory.CreateObject("WbemScripting.SWBemLocator");
        dynamic sWbemServices = sWbemLocator.ConnectServer(".");
        sWbemServices.Security_.ImpersonationLevel = 3; //impersonate

        string query = "SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true";
        dynamic results = sWbemServices.ExecQuery(query);

        int mtu = int.MaxValue;
        foreach (dynamic result in results)
        {
            if (result.IPConnectionMetric < mtu)
            {
                mtu = result.IPConnectionMetric;
                mac = result.MACAddress;
            }
        }
    }
    return mac;
}
AVee
quelle
7
public static PhysicalAddress GetMacAddress()
{
    var myInterfaceAddress = NetworkInterface.GetAllNetworkInterfaces()
        .Where(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
        .OrderByDescending(n => n.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
        .Select(n => n.GetPhysicalAddress())
        .FirstOrDefault();

    return myInterfaceAddress;
}
Tony
quelle
Wenn ich diesen Code ausführe, erhält er die Adresse der Person, die die Anwendung ausführt? Das heißt, es wird nicht die Server-IP-Adresse erhalten, unter der dies gehostet wird, richtig?
Nate Pet
Es erhält die MAC-Adresse des Host-Computers, des Servers.
Tony
6

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.

public string GetDefaultMacAddress()
{
    Dictionary<string, long> macAddresses = new Dictionary<string, long>();
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
            macAddresses[nic.GetPhysicalAddress().ToString()] = nic.GetIPStatistics().BytesSent + nic.GetIPStatistics().BytesReceived;
    }
    long maxValue = 0;
    string mac = "";
    foreach(KeyValuePair<string, long> pair in macAddresses)
    {
        if (pair.Value > maxValue)
        {
            mac = pair.Key;
            maxValue = pair.Value;
        }
    }
    return mac;
}
Ramunas
quelle
6

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

    /// <summary>
    /// Get the MAC of the Netowrk Interface used to connect to the specified url.
    /// </summary>
    /// <param name="allowedURL">URL to connect to.</param>
    /// <param name="port">The port to use. Default is 80.</param>
    /// <returns></returns>
    private static PhysicalAddress GetCurrentMAC(string allowedURL, int port = 80)
    {
        //create tcp client
        var client = new TcpClient();

        //start connection
        client.Client.Connect(new IPEndPoint(Dns.GetHostAddresses(allowedURL)[0], port));

        //wai while connection is established
        while(!client.Connected)
        {
            Thread.Sleep(500);
        }

        //get the ip address from the connected endpoint
        var ipAddress = ((IPEndPoint)client.Client.LocalEndPoint).Address;

        //if the ip is ipv4 mapped to ipv6 then convert to ipv4
        if(ipAddress.IsIPv4MappedToIPv6)
            ipAddress = ipAddress.MapToIPv4();        

        Debug.WriteLine(ipAddress);

        //disconnect the client and free the socket
        client.Client.Disconnect(false);
        
        //this will dispose the client and close the connection if needed
        client.Close();

        var allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        //return early if no network interfaces found
        if(!(allNetworkInterfaces?.Length > 0))
            return null;

        foreach(var networkInterface in allNetworkInterfaces)
        {
            //get the unicast address of the network interface
            var unicastAddresses = networkInterface.GetIPProperties().UnicastAddresses;
           
            //skip if no unicast address found
            if(!(unicastAddresses?.Count > 0))
                continue;

            //compare the unicast addresses to see 
            //if any match the ip address used to connect over the network
            for(var i = 0; i < unicastAddresses.Count; i++)
            {
                var unicastAddress = unicastAddresses[i];

                //this is unlikely but if it is null just skip
                if(unicastAddress.Address == null)
                    continue;
                
                var ipAddressToCompare = unicastAddress.Address;

                Debug.WriteLine(ipAddressToCompare);

                //if the ip is ipv4 mapped to ipv6 then convert to ipv4
                if(ipAddressToCompare.IsIPv4MappedToIPv6)
                    ipAddressToCompare = ipAddressToCompare.MapToIPv4();

                Debug.WriteLine(ipAddressToCompare);

                //skip if the ip does not match
                if(!ipAddressToCompare.Equals(ipAddress))
                    continue;

                //return the mac address if the ip matches
                return networkInterface.GetPhysicalAddress();
            }
              
        }

        //not found so return null
        return null;
    }

Um es aufzurufen, müssen Sie eine URL übergeben, mit der Sie eine Verbindung herstellen können:

var mac = GetCurrentMAC("www.google.com");

Sie können auch eine Portnummer angeben. Wenn nicht angegeben, ist der Standardwert 80.

AKTUALISIERUNG:

2020

  • Kommentare hinzugefügt, um den Code zu erklären.
  • Korrigiert für neuere Betriebssysteme, die IPV4 verwenden, das IPV6 zugeordnet ist (wie Windows 10).
  • Reduzierte Verschachtelung.
  • Der Code wurde mit "var" aktualisiert.
Jonathan Alfaro
quelle
1
Dies ist sehr interessant, ich werde es versuchen, da ich in meinem Fall möchte, dass der Client a) die Quelladresse ermittelt, die für die Kommunikation mit meinem Server verwendet wird (dies muss NICHT unbedingt über das Internet erfolgen) und b) die MAC-Adresse ist von der Netzwerkkarte, die diese IP-Adresse bereitstellt ...
Brian B
5

Sie könnten sich für die NIC-ID entscheiden:

 foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) {
     if (nic.OperationalStatus == OperationalStatus.Up){
         if (nic.Id == "yay!")
     }
 }

Es ist nicht die MAC-Adresse, aber es ist eine eindeutige Kennung, wenn Sie danach suchen.

mmr
quelle
2

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:

   public static string GetMacAndDescription()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
        IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
        string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
        string description = (from o in objects orderby o["IPConnectionMetric"] select o["Description"].ToString()).FirstOrDefault();
        return mac + ";" + description;
    }

    public static string GetMacByDescription( string description)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
        IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
        string mac = (from o in objects where o["Description"].ToString() == description select o["MACAddress"].ToString()).FirstOrDefault();
        return mac;
    }
Detlef
quelle
2

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")

public static string GetMacAddressUsedByIp(string ipAddress)
    {
        var ips = new List<string>();
        string output;

        try
        {
            // Start the child process.
            Process p = new Process();
            // Redirect the output stream of the child process.
            p.StartInfo.UseShellExecute = false;

            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.FileName = "ipconfig";
            p.StartInfo.Arguments = "/all";
            p.Start();
            // Do not wait for the child process to exit before
            // reading to the end of its redirected stream.
            // p.WaitForExit();
            // Read the output stream first and then wait.
            output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

        }
        catch
        {
            return null;
        }

        // pattern to get all connections
        var pattern = @"(?xis) 
(?<Header>
     (\r|\n) [^\r]+ :  \r\n\r\n
)
(?<content>
    .+? (?= ( (\r\n\r\n)|($)) )
)";

        List<Match> matches = new List<Match>();

        foreach (Match m in Regex.Matches(output, pattern))
            matches.Add(m);

        var connection = matches.Select(m => new
        {
            containsIp = m.Value.Contains(ipAddress),
            containsPhysicalAddress = Regex.Match(m.Value, @"(?ix)Physical \s Address").Success,
            content = m.Value
        }).Where(x => x.containsIp && x.containsPhysicalAddress)
        .Select(m => Regex.Match(m.content, @"(?ix)  Physical \s address [^:]+ : \s* (?<Mac>[^\s]+)").Groups["Mac"].Value).FirstOrDefault();

        return connection;
    }
Tono Nam
quelle
Das ist nicht effizient ... Ich würde es nicht empfehlen.
Ivandro IG Jao
2

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.

string GetMacAddress()
{
    var connectionProfile = NetworkInformation.GetInternetConnectionProfile();
    if (connectionProfile == null) return "";

    var inUseId = connectionProfile.NetworkAdapter.NetworkAdapterId.ToString("B").ToUpperInvariant();
    if(string.IsNullOrWhiteSpace(inUseId)) return "";

    var mac = NetworkInterface.GetAllNetworkInterfaces()
        .Where(n => inUseId == n.Id)
        .Select(n => n.GetPhysicalAddress().GetAddressBytes().Select(b=>b.ToString("X2")))
        .Select(macBytes => string.Join(" ", macBytes))
        .FirstOrDefault();

    return mac;
}
Greg Gorman
quelle
2
string mac = "";
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {

                if (nic.OperationalStatus == OperationalStatus.Up && (!nic.Description.Contains("Virtual") && !nic.Description.Contains("Pseudo")))
                {
                    if (nic.GetPhysicalAddress().ToString() != "")
                    {
                        mac = nic.GetPhysicalAddress().ToString();
                    }
                }
            }
MessageBox.Show(mac);
Hadi Safari
quelle
2
Diese Antwort könnte durch eine kurze Erläuterung der Funktionsweise des Codes und der Lösung des Problems verbessert werden.
Greg der Unglaubliche
1

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.

public string GetMacAddress()
{
    const int MIN_MAC_ADDR_LENGTH = 12;
    string macAddress = string.Empty;
    Dictionary<string, long> macPlusSpeed = new Dictionary<string, long>();
    try
    {
        foreach(NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            System.Diagnostics.Debug.WriteLine("Found MAC Address: " + nic.GetPhysicalAddress() + " Type: " + nic.NetworkInterfaceType);

            string tempMac = nic.GetPhysicalAddress().ToString();

            if(!string.IsNullOrEmpty(tempMac) && tempMac.Length >= MIN_MAC_ADDR_LENGTH)
                macPlusSpeed.Add(tempMac, nic.Speed);
        }

        macAddress = macPlusSpeed.OrderByDescending(row => row.Value).ThenBy(row => row.Key).FirstOrDefault().Key;
    }
    catch{}

    System.Diagnostics.Debug.WriteLine("Fastest MAC address: " + macAddress);

    return macAddress;
}
user369122
quelle
1
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
     if (nic.OperationalStatus == OperationalStatus.Up)
     {
            PhysicalAddress Mac = nic.GetPhysicalAddress();
     }
}
Mohamad Javadi
quelle
0

ipconfig.exewird mithilfe verschiedener DLLs implementiert, einschließlich iphlpapi.dll... Durch Googeln wird iphlpapieine entsprechende Win32-API angezeigt , die in MSDN dokumentiert ist.

ChrisW
quelle
0

Versuche dies:

    /// <summary>
    /// returns the first MAC address from where is executed 
    /// </summary>
    /// <param name="flagUpOnly">if sets returns only the nic on Up status</param>
    /// <returns></returns>
    public static string[] getOperationalMacAddresses(Boolean flagUpOnly)
    {
        string[] macAddresses = new string[NetworkInterface.GetAllNetworkInterfaces().Count()];

        int i = 0;
        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            if (nic.OperationalStatus == OperationalStatus.Up || !flagUpOnly)
            {
                macAddresses[i] += ByteToHex(nic.GetPhysicalAddress().GetAddressBytes());
                //break;
                i++;
            }
        }
        return macAddresses;
    }
Richard
quelle