Neste artigo vou mostrar como obter o endereço MAC usando a linguagem C#. |
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:
2 Panels
8 Buttons
1 Label
1 ListBox
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
C# - Identificador 'Digital' para o computador local - Macoratti