Preciso de uma maneira de obter o endereço MAC de uma máquina, independentemente do sistema operacional em execução usando C #. O aplicativo precisará funcionar no XP / Vista / Win7 de 32 e 64 bits, bem como nesses sistemas operacionais, mas com um padrão de idioma estrangeiro. Muitos dos comandos C # e consultas do SO não funcionam no SO. Alguma ideia? Eu raspei a saída de "ipconfig / all", mas isso é terrivelmente não confiável, pois o formato de saída difere em todas as máquinas.
obrigado
Respostas:
Solução mais limpa
Ou:
fonte
return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();
(Se não é o seu lugar, ele deve ser sua coisa.)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
antes da finalSelect
. Dessa forma, ele obteria apenas o endereço físico e o serializaria para o realNetworkInterface
que você obtém. Não se esqueça de adicionar a verificação nula (?) Após oFirstOrDefault
.NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Aqui está um código C # que retorna o endereço MAC da primeira interface de rede operacional. Supondo que a
NetworkInterface
montagem seja implementada no tempo de execução (ou seja, Mono) usado em outros sistemas operacionais, isso funcionaria em outros sistemas operacionais.Nova versão: retorna a NIC com a velocidade mais rápida que também possui um endereço MAC válido.
Versão original: apenas retorna a primeira.
A única coisa que eu não gosto nessa abordagem é que, se você tem um Nortel Packet Miniport ou algum tipo de conexão VPN, ele pode ser escolhido. Pelo que sei, não há como distinguir o MAC de um dispositivo físico real de algum tipo de interface de rede virtual.
fonte
using System.Net.NetworkInformation;
A propriedade MACAddress da classe WMI Win32_NetworkAdapterConfiguration pode fornecer o endereço MAC de um adaptador. (Espaço para nome System.Management)
Se você não conhece a API do WMI (Windows Management Instrumentation), há uma boa visão geral aqui dos aplicativos .NET.
O WMI está disponível em todas as versões do Windows com o tempo de execução .Net.
Aqui está um exemplo de código:
fonte
O WMI é a melhor solução se a máquina à qual você está se conectando for uma máquina Windows, mas se você estiver procurando por um Linux, Mac ou outro tipo de adaptador de rede, precisará usar outra coisa. Aqui estão algumas opções:
Heres uma amostra do item # 3. Essa parece ser a melhor opção se o WMI não for uma solução viável:
Para dar crédito onde é devido, esta é a base para esse código: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#
fonte
Usamos o WMI para obter o endereço mac da interface com a métrica mais baixa, por exemplo, as janelas da interface preferem usar, assim:
Ou no Silverlight (precisa de confiança elevada):
fonte
fonte
O IMHO retornando o primeiro endereço mac não é uma boa ideia, especialmente quando máquinas virtuais estão hospedadas. Portanto, verifico a soma de bytes enviados / recebidos e seleciono a conexão mais usada, que não é perfeita, mas deve estar correta 9/10 vezes.
fonte
Este método determinará o endereço MAC da interface de rede usada para conectar-se à URL e porta especificadas.
Todas as respostas aqui não são capazes de atingir esse objetivo.
Eu escrevi essa resposta anos atrás (em 2014). Então eu decidi dar um pequeno "lifting facial". Por favor, olhe a seção de atualizações
Para chamá-lo, você precisa passar um URL para se conectar da seguinte maneira:
Você também pode especificar um número de porta. Se não especificado, o padrão é 80.
ATUALIZAÇÕES:
2020
fonte
Você pode ir para o NIC ID:
Não é o endereço MAC, mas é um identificador exclusivo, se é isso que você está procurando.
fonte
Eu realmente gosto da solução da AVee com a menor métrica de conexão IP! Mas se um segundo nic com a mesma métrica estiver instalado, a comparação MAC poderá falhar ...
Melhor você armazenar a descrição da interface com o MAC. Em comparações posteriores, você pode identificar o nic certo por essa sequência. Aqui está um código de exemplo:
fonte
digamos que eu tenho um TcpConnection usando meu ip local 192.168.0.182. Então, se eu gostaria de saber o endereço mac dessa NIC, chamarei o meothod como:
GetMacAddressUsedByIp("192.168.0.182")
fonte
Realmente odeio desenterrar este post antigo, mas acho que a pergunta merece outra resposta específica para o Windows 8-10.
Usando NetworkInformation no namespace Windows.Networking.Connectivity , é possível obter o ID do adaptador de rede que o Windows está usando. Em seguida, você pode obter o endereço MAC da interface do GetAllNetworkInterfaces () mencionado anteriormente.
Isso não funcionará nos Aplicativos da Windows Store, pois o NetworkInterface em System.Net.NetworkInformation não expõe GetAllNetworkInterfaces.
fonte
fonte
Mudou um pouco o código do blak3r. Caso você tenha dois adaptadores com a mesma velocidade. Classifique por MAC, para obter sempre o mesmo valor.
fonte
fonte
ipconfig.exe
é implementado usando várias DLLs, incluindoiphlpapi.dll
... A pesquisa no Googleiphlpapi
revela uma API Win32 correspondente documentada no MSDN.fonte
Tente o seguinte:
fonte