C# - Obtendo o endereço MAC

 Neste artigo vou mostrar como obter o endereço MAC usando a linguagem C#.


Você sabe o que é o endereço MAC ? 

Para compreender melhor o artigo vou dar uma breve introdução a respeito. Acompanhe-me...

MAC significa Media Access Control (Endereços MAC) e possuem 48 bits de tamanho expressos com doze dígitos hexadecimais. Eles são utilizados para identificar a placa de rede.

Os primeiros seis dígitos são administrados pelo consórcio IEEE e identificam o fabricante ou fornecedor da placa de rede ; os seis últimos são uma identificação da placa.

Não existem duas placas com o mesmo endereço MAC , ou seja, este endereço é único para cada placa de rede em cada computador. Os endereços MAC geralmente são gravados na memória ROM e copiados para a memória de RAM quando a placa de rede é iniciada.

Antes de sair da fábrica, o fabricante do hardware atribui um endereço físico a cada placa de rede. Esse endereço é programado em um chip na placa de rede. Como o endereço MAC está localizado na placa de rede, se a placa de rede fosse trocada em um computador, o endereço físico da estação mudaria para o novo endereço MAC. Há dois formatos para os endereços MAC: 0000.0c12.3456 ou 00-00-0c-12-34-56.

Em uma rede Ethernet, quando um dispositivo quer enviar dados para outro dispositivo, ele pode abrir um caminho de comunicação com o outro dispositivo usando o seu endereço MAC. Quando uma origem envia dados em uma rede, os dados carregam o endereço MAC do destino pretendido.

Como esses dados trafegam pelos meios da rede, a placa de rede em cada dispositivo na rede verifica se o seu endereço MAC corresponde ao endereço de destino físico carregado pelo pacote de dados. Se não corresponder, a placa de rede descarta o pacote de dados. Se não houver correspondência, a placa de rede ignora o pacote de dados e permite que ele continue sua viajem pela rede até a estação seguinte.

Você pode obter informações sobre o endereço MAC da sua placa de rede usando o comando Ipconfig /all ou usar o namespace System.Management ou os recursos do namespace System.Net.NetworkInformation.

Assim , podemos obter o endereço MAC de diversas formas e neste artigo eu vou mostrar algumas delas usando a linguagem C#.

Recursos Usados:

Criando o projeto no VS Community 2017

Abra no VS community 2017 e no menu File clique em New Project;

A seguir selecione o template Visual C# -> Windows -> Windows Forms Application e informe o nome CShp_MAC e clique em OK;

Agora abra o formulário Form1.cs e inclua os seguintes controles no formulário:

Disponha os controles conforme o leiaute da figura abaixo:

Criando a classe InfoMac

Vamos incluir no projeto uma classe chamada InfoMac (use o nome a seu gosto) para conter os métodos onde vamos obter o endereço MAC.

No menu Project clique em Add Class e informe o nome InfoMac. A seguir inclua o código abaixo nesta classe:

using System;
using System.Collections.Generic;
using System.Management;
using System.Net.NetworkInformation;
using System.Text;
namespace CShp_MAC
{
    public class InfoMac
    {
        //usar o namespace System.Net e suporta IPv4 e IPv6
        public static string GetEnderecoMAC1()
        {
            try
            {
                NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
                String enderecoMAC = string.Empty;
                foreach (NetworkInterface adapter in nics)
                {
                    // retorna endereço MAC do primeiro cartão
                    if (enderecoMAC == String.Empty)
                    {
                        IPInterfaceProperties properties = adapter.GetIPProperties();
                        enderecoMAC = adapter.GetPhysicalAddress().ToString();
                    }
                }
                return enderecoMAC;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
        public static PhysicalAddress GetEnderecoMAC2()
        {
            try
            { 
                foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
                {
                    // Somente considera interface Ethernet
                    if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
                        nic.OperationalStatus == OperationalStatus.Up)
                    {
                        return nic.GetPhysicalAddress();
                    }
                }
                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        // usa o namespace System.Management
        // que recupera uma coleção de objetos de gerenciamento 
        // baseada em uma consulta especificada.
        public static string GetEnderecoMAC3()
        {
            try
            {
                ManagementObjectSearcher objMOS = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection objMOC = objMOS.Get();
                string enderecoMAC = String.Empty;
                foreach (ManagementObject objMO in objMOC)
                {
                    //retorna endereço MAC do primeiro cartão
                    if (enderecoMAC == String.Empty) 
                    {
                        if( objMO["MacAddress"] != null)
                            enderecoMAC = objMO["MacAddress"].ToString();
                    }
                    objMO.Dispose();
                }
                enderecoMAC = enderecoMAC.Replace(":", "");
                return enderecoMAC;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static string GetEnderecoMAC4()
        {
            string enderecoMac = "";
            try
            {
                foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
                {
                    if (nic.NetworkInterfaceType != NetworkInterfaceType.Ethernet) continue;
                    if (nic.OperationalStatus == OperationalStatus.Up)
                    {
                        enderecoMac += nic.GetPhysicalAddress().ToString();
                        break;
                    }
                }
                return enderecoMac;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
        public static string GetEnderecoMAC5()
        {
            try
            { 
	            //cria um objeto da classe management usando a classe
	            //Win32_NetworkAdapterConfiguration para obter os atributos
	            //do adaptador de rede
	            ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapterConfiguration");
	            //cria a coleção ManagementObjectCollection 
	            ManagementObjectCollection objCol = mgmt.GetInstances();
	            string address = String.Empty;	        
                     //percorre todos os objetos
	            foreach (ManagementObject obj in objCol)
	            {
	                if (address == String.Empty)  //retorna somente o valor do primeiro cartão
	                {
	                    //pega o valor do primeiro adaptador 
	                    if ((bool) obj["IPEnabled"] == true) address = obj["MacAddress"].ToString();
	                }
	                //libera o objeto
	                obj.Dispose();
	            }
	            address = address.Replace(":", "");
	            return address;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static List<string> GetEnderecoMAC6()
        {
            ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
            List<string> adapters = new List<string>();
            foreach (ManagementObject mo in query.Get())
                if ((bool)mo["IPEnabled"] && mo["MacAddress"] != null)
                {
                    adapters.Add((string)mo["Description"] + " " + (string)mo["MacAddress"]);
                }
            return adapters;
        }
        public static string[] GetEnderecosFisicos()
        {
            var resultado = new List<string>();
            try
            { 
                NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in interfaces)
                {
                    PhysicalAddress address = adapter.GetPhysicalAddress();
                    byte[] bytes = address.GetAddressBytes();
                    if (bytes.Length == 0) continue;
                    var mac = new StringBuilder();
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        mac.Append(bytes[i].ToString("X2"));
                        if (i != bytes.Length - 1) mac.Append("-");
                    }
                    resultado.Add(mac.ToString());
                }
                return resultado.ToArray();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}

Temos neste código 7 métodos estáticos que retornam o endereço MAC (ou os endereços MAC) numa varieadade de implementações.

Fique à vontade para ajustar o código e realizar os ajustes que desejar.

Definindo o código do formulário

Inclua os seguintes namespaces no formulário:

using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Windows.Forms;

1- Obtendo o endereço MAC 1

No evento Click do botão de comando Procurar inclua o código abaixo:

       private void btnMAC1_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            {
                lbResultado.Items.Add(InfoMac.GetEnderecoMAC1());
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }

2- Obtendo o endereço MAC 2

       private void btnMAC2_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            { 
                string resultado="";
                PhysicalAddress address = InfoMac.GetEnderecoMAC2();
                byte[] bytes = address.GetAddressBytes();
                for (int i = 0; i < bytes.Length; i++)
                {
                    // exibe o endereço fisico em hexadecimal
                    resultado = resultado + bytes[i].ToString("X2");
                    // insere um hifen depois de cada byte
                    if (i != bytes.Length - 1)
                    {
                        resultado += "-";
                    }
                }
                lbResultado.Items.Add(resultado);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
     }

3- Obtendo o endereço MAC 3

       private void btnMAC3_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            { 
              lbResultado.Items.Add(InfoMac.GetEnderecoMAC3());
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
       }

4- Obtendo o endereço MAC 4

       private void btnMAC4_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            { 
                lbResultado.Items.Add(InfoMac.GetEnderecoMAC4());
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }

5- Obtendo o endereço MAC 5

       private void btnMAC5_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            { 
              lbResultado.Items.Add(InfoMac.GetEnderecoMAC5());
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }
 

6- Obtendo o endereço MAC 6

       private void btnMAC6_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            {
                List<string> enderecos = InfoMac.GetEnderecoMAC6();
                foreach (string endereco in enderecos)
                {
                    lbResultado.Items.Add(endereco);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }

7- Obtendo o endereço MAC 7

        private void btnMAC7_Click(object sender, EventArgs e)
        {
            Limpa();
            try
            {
                string[] enderecos = InfoMac.GetEnderecosFisicos();
                foreach (string endereco in enderecos)
                {
                    lbResultado.Items.Add(endereco);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }

Código do Método Limpa() :

     private void Limpa()
     {
            lbResultado.Items.Clear();
     }

Executando o projeto teremos o resultado a seguir:

Pegue o projeto completo aqui:  CShp_MAC.zip

Eu sou a videira, vós as varas; quem está em mim, e eu nele, esse dá muito fruto; porque sem mim nada podeis fazer. 
João 15:5

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti