C # 'da makinenin MAC adresini almak için güvenilir yöntem


132

C # kullanarak çalıştırdığı işletim sisteminden bağımsız olarak bir makinenin MAC adresini almanın bir yoluna ihtiyacım var. Uygulamanın XP / Vista / Win7 32 ve 64 bit üzerinde ve bu işletim sistemlerinde, ancak varsayılan yabancı dil ile çalışması gerekecektir. C # komutlarının ve işletim sistemi sorgularının çoğu işletim sistemi genelinde çalışmaz. Herhangi bir fikir? "İpconfig / all" çıktısını kazıyordum, ancak çıktı formatı her makinede farklılık gösterdiğinden bu son derece güvenilmez.

Teşekkürler


7
İşletim sistemi genelinde derken, farklı Microsoft işletim sistemlerinde mi demek istiyorsunuz?
John Weldon

Yanıtlar:


137

Daha temiz çözüm

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

Veya:

String firstMacAddress = NetworkInterface
    .GetAllNetworkInterfaces()
    .Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback )
    .Select( nic => nic.GetPhysicalAddress().ToString() )
    .FirstOrDefault();

44
Veya lambda, eğer senin şeyin buysa! return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();(Eğer senin işin değilse, senin işin olmalı.)
GONeale

7
En hızlı 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();
olanı

1
İlkini seçmek her zaman en iyi seçenek değildir. En çok kullanılan bağlantıyı seçme: stackoverflow.com/a/51821927/3667
Ramunas

Optimizasyon notu: Finalden FirstOrDefaultönce arayabilirsiniz Select. Bu şekilde, yalnızca fiziksel adres alır ve aldığınız gerçek için onu seri hale getirir NetworkInterface. .Tarafından sonra boş onay (?) Eklemeyi unutmayın FirstOrDefault.
GregaMohorko

Bunu elde etmenin daha hızlı bir hesaplama yolu, verilen koşulla eşleşen tüm ağları değerlendirmenize gerek yok, sadece NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
ilkine

80

İşte ilk operasyonel ağ arayüzünün MAC adresini döndüren bazı C # kodu. Derlemenin NetworkInterfacediğer işletim sistemlerinde kullanılan çalışma zamanında (yani Mono) uygulandığını varsayarsak, bu diğer işletim sistemlerinde çalışacaktır.

Yeni sürüm: Geçerli bir MAC adresine sahip olan en yüksek hızda NIC'yi döndürür.

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

Orijinal Sürüm: yalnızca birincisini döndürür.

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

Bu yaklaşımla ilgili hoşlanmadığım tek şey, bir Nortel Packet Miniport veya bir tür VPN bağlantısına sahipseniz, seçilme potansiyeline sahip olmasıdır. Anladığım kadarıyla, gerçek bir fiziksel aygıtın MAC'ini bir tür sanal ağ arabiriminden ayırmanın bir yolu yok.


6
İlk operasyonel arayüzü seçmeyin. Bu, Loopback arabirimlerini, ara sıra bağlanan 3G kartlarını vb. Döndürebilir, ki bunlar muhtemelen istediğiniz gibi değildir. NetworkInterfaceType ( msdn.microsoft.com/en-us/library/… ), daha bilinçli bir seçim yapabilmeniz için size NetworkInterface bağlantısı hakkında daha fazla bilgi verecektir. Ayrıca bir makinede birçok etkin bağlantı olabileceğini ve sıralarının tahmin edilemeyebileceğini unutmayın.
Dave R.

@DaveR. NetworkInterfaceType'a baktım, deneyimlerime göre sanal bir adaptör olsa bile temelde neredeyse her zaman Ethernet döndürüyor, bu yüzden oldukça işe yaramaz buldum.
blak3r

1
En düşük GatewayMetric'e sahip Arayüzü seçmelisiniz. Bu, "en hızlı, en güvenilir veya en az kaynak yoğun rotaya" sahip bağlantı olmalıdır. Temel olarak size Windows'un kullanmayı tercih ettiği arayüzü verecektir. Ancak, bunu gerçekten elde etmek için WMI'ye ihtiyacınız olduğunu düşünüyorum. Bakalım onu ​​çalıştırabilecek miyim ...
AVee

6
using System.Net.NetworkInformation;
Tamlık

1
FWIW, bir gigabit NIC ve Hyper-V yüklediyseniz, ayrıca 10gigabit sanal NIC'e sahip olacaksınız. :) Çözülmesi zor problem ...
Christopher Painter

10

MACAdresi malı Win32_NetworkAdapterConfiguration WMI sınıfının bir bağdaştırıcısının MAC adresini size sağlayabilir. (Sistem Yönetimi Ad Alanı)

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"

WMI API'ye (Windows Yönetim Araçları) aşina değilseniz, burada .NET uygulamaları için iyi bir genel bakış var .

WMI, .Net çalışma zamanına sahip tüm Windows sürümlerinde kullanılabilir.

İşte bir kod örneği:

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

9

Bağlandığınız makine bir Windows makinesiyse WMI en iyi çözümdür, ancak bir linux, mac veya başka bir ağ bağdaştırıcısı türüne bakıyorsanız, başka bir şey kullanmanız gerekecektir. İşte bazı seçenekler:

  1. DOS komutu nbtstat -a'yı kullanın. Bir işlem oluşturun, bu komutu çağırın, çıktıyı ayrıştırın.
  2. Önce, NIC'inizin ARP tablosundaki komutu önbelleğe aldığından emin olmak için IP'ye ping atın, ardından DOS komutu arp -a'yı kullanın. 1. seçenekteki gibi işlemin çıktısını ayrıştırın.
  3. İphlpapi.dll'de sendarp için korkunç bir yönetilmeyen çağrı kullanın

İşte 3. maddenin bir örneği. WMI uygun bir çözüm değilse bu en iyi seçenek gibi görünüyor:

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

Verilmesi gereken yere atıfta bulunmak için, bu kodun temeli budur: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#


OP ile aynı şeyi arıyordum ve tam da ihtiyacım olan şey bu!
QueueHammer

1. ve 2. seçeneklerde, bir Windows makinesindeyseniz DOS komutlarını ve Linux veya Mac'te eşdeğer komutu kastediyorsunuz, değil mi?
Raikol Amaro

8

En düşük ölçüye sahip arayüzün mac adresini almak için WMI kullanıyoruz, örneğin arayüz pencereleri aşağıdaki gibi kullanmayı tercih edecek:

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

Veya Silverlight'ta (yüksek güven gerektirir):

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

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

Bu kodu çalıştırırsam, uygulamayı çalıştıran kişinin adresini alacak mı? Bunun, barındırıldığı sunucu IP adresini alamayacağı anlamına gelir, doğru mu?
Nate Pet

Sunucu Makinenin MAC adresini alır.
Tony

6

IMHO'nun ilk mac adresini döndürmesi, özellikle sanal makineler barındırıldığında iyi bir fikir değildir. Bu nedenle, gönderilen / alınan bayt toplamını kontrol ediyorum ve en çok kullanılan bağlantıyı seçiyorum, bu mükemmel değil, ancak 9/10 kez doğru olmalı.

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

6

Bu yöntem, belirtilen url ve bağlantı noktasına bağlanmak için kullanılan Ağ Arayüzünün MAC adresini belirleyecektir.

Buradaki tüm cevaplar bu amaca ulaşmaya yeterli değil.

Bu cevabı yıllar önce yazdım (2014'te). Ben de biraz "yüz germe" yapmaya karar verdim. Lütfen güncellemeler bölümüne bakın

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

Çağırmak için şu şekilde bağlanmak için bir URL iletmeniz gerekir:

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

Ayrıca bir bağlantı noktası numarası da belirtebilirsiniz. Belirtilmezse varsayılan 80'dir.

GÜNCEL:

2020

  • Kodu açıklamak için yorumlar eklendi.
  • IPV6'ya eşlenmiş IPV4 kullanan daha yeni işletim sistemlerinde (Windows 10 gibi) kullanılmak üzere düzeltilmiştir.
  • Azaltılmış yuvalama.
  • Kodun "var" kullanımı yükseltildi.

1
Bu çok ilginç, deneyeceğim, benim durumumda istemcinin a) sunucumla iletişim kurmak için kullanılan kaynak adresini keşfetmesini istiyorum (mutlaka internet üzerinden OLMAYACAK) ve b) MAC adresi ne bu IP adresini sağlayan bir
Brian B

5

NIC Kimliği için gidebilirsiniz:

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

MAC adresi değil, ancak aradığınız buysa, benzersiz bir tanımlayıcıdır.


2

En düşük IP bağlantı ölçüsüne sahip AVee çözümünü gerçekten seviyorum! Ancak aynı metriğe sahip ikinci bir nicki kurulursa, MAC karşılaştırması başarısız olabilir ...

Arayüzün açıklamasını MAC ile daha iyi saklayın. Daha sonraki karşılaştırmalarda doğru nic'i bu dizeyle tanımlayabilirsiniz. İşte örnek bir kod:

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

2

Diyelim ki 192.168.0.182 yerel ipimi kullanan bir TcpConnection'ım var. O zaman bu NIC'nin mac adresini bilmek istersem, meotodu şu şekilde arayacağım: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;
    }

Bu verimli değil ... Bunu yapmanızı tavsiye etmem.
Ivandro IG Jao

2

Bu eski yazıyı kazmaktan gerçekten nefret ediyorum ama sorunun 8-10 pencerelerine özgü başka bir cevabı hak ettiğini düşünüyorum.

Kullanılması NetworkInformation gelen Windows.Networking.Connectivity ad, ağ bağdaştırıcısı pencerelerin Kimliği kullanıyor alabilirsiniz. Daha sonra, daha önce bahsedilen GetAllNetworkInterfaces () 'dan arayüz MAC Adresini alabilirsiniz.

System.Net.NetworkInformation içindeki NetworkInterface GetAllNetworkInterfaces göstermediğinden bu , Windows Mağazası Uygulamalarında çalışmaz.

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

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

2
Bu cevap, kodun ne yaptığı ve sorunu nasıl çözdüğü hakkında kısa bir açıklama ile geliştirilebilir.
Greg the Incredulous

1

Blak3r kodunu biraz değiştirdi. Aynı hıza sahip iki adaptörünüz olması durumunda. MAC'a göre sıralayın, böylece her zaman aynı değeri elde edersiniz.

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

1
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
     if (nic.OperationalStatus == OperationalStatus.Up)
     {
            PhysicalAddress Mac = nic.GetPhysicalAddress();
     }
}

0

ipconfig.exeaşağıdakiler dahil olmak üzere çeşitli DLL'ler kullanılarak uygulanır iphlpapi.dll... Googling iphlpapi, MSDN'de belgelenen karşılık gelen bir Win32 API'yi ortaya çıkarır.


0

Bunu dene:

    /// <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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.