Necesito una forma de obtener la dirección MAC de una máquina, independientemente del sistema operativo que se ejecuta con C #. La aplicación deberá funcionar en XP / Vista / Win7 de 32 y 64 bits, así como en esos sistemas operativos, pero con un idioma extranjero predeterminado. Muchos de los comandos de C # y las consultas del sistema operativo no funcionan en el sistema operativo. ¿Algunas ideas? He estado raspando la salida de "ipconfig / all" pero esto es terriblemente poco confiable ya que el formato de salida difiere en cada máquina.
Gracias
Respuestas:
Solución más limpia
O:
fuente
return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();
(Si no es lo tuyo, debería ser lo tuyo.)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 de la finalSelect
. De esta manera, solo obtendría una dirección física y la serializaría según el valor realNetworkInterface
que obtenga. No olvide agregar el cheque nulo (?) Después deFirstOrDefault
.NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Aquí hay un código C # que devuelve la dirección MAC de la primera interfaz de red operativa. Suponiendo que el
NetworkInterface
ensamblaje se implemente en el tiempo de ejecución (es decir, Mono) utilizado en otros sistemas operativos, esto funcionaría en otros sistemas operativos.Nueva versión: devuelve la NIC con la velocidad más rápida que también tiene una dirección MAC válida.
Versión original: solo devuelve la primera.
Lo único que no me gusta de este enfoque es que si tiene un Nortport Packet Miniport o algún tipo de conexión VPN, tiene el potencial de ser elegido. Por lo que puedo decir, no hay forma de distinguir el MAC de un dispositivo físico real de algún tipo de interfaz de red virtual.
fuente
using System.Net.NetworkInformation;
El MACAddress propiedad de la clase WMI Win32_NetworkAdapterConfiguration puede proporcionarle la dirección MAC de un adaptador. (System.Management Namespace)
Si no está familiarizado con la API WMI (Instrumental de administración de Windows), aquí encontrará una buena descripción general de las aplicaciones .NET.
WMI está disponible en todas las versiones de Windows con el tiempo de ejecución .Net.
Aquí hay un ejemplo de código:
fuente
WMI es la mejor solución si la máquina a la que se está conectando es una máquina Windows, pero si está buscando un adaptador de red para Linux, Mac u otro tipo, entonces necesitará usar otra cosa. Aquí hay algunas opciones:
Heres una muestra del artículo # 3. Esta parece ser la mejor opción si WMI no es una solución viable:
Para dar crédito donde es debido, esta es la base de ese código: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#
fuente
Usamos WMI para obtener la dirección mac de la interfaz con la métrica más baja, por ejemplo, las ventanas de la interfaz preferirán usar, así:
O en Silverlight (necesita una confianza elevada):
fuente
fuente
En mi humilde opinión, devolver la primera dirección mac no es una buena idea, especialmente cuando las máquinas virtuales están alojadas. Por lo tanto, verifico la suma de bytes enviados / recibidos y selecciono la conexión más utilizada, eso no es perfecto, pero debe ser correcto 9/10 veces.
fuente
Este método determinará la dirección MAC de la interfaz de red utilizada para conectarse a la url y el puerto especificados.
Todas las respuestas aquí no son capaces de lograr este objetivo.
Escribí esta respuesta hace años (en 2014). Así que decidí darle un poco de "estiramiento facial". Por favor mira la sección de actualizaciones
Para llamarlo, debe pasar una URL para conectarse de esta manera:
También puede especificar un número de puerto. Si no se especifica, el valor predeterminado es 80.
ACTUALIZACIONES:
2020
fuente
Podrías buscar la ID de NIC:
No es la dirección MAC, pero es un identificador único, si eso es lo que estás buscando.
fuente
¡Realmente me gusta la solución de AVee con la métrica de conexión IP más baja! Pero si se instala un segundo nic con la misma métrica, la comparación MAC podría fallar ...
Mejor guarde la descripción de la interfaz con el MAC. En comparaciones posteriores, puede identificar el nic correcto mediante esta cadena. Aquí hay un código de muestra:
fuente
Digamos que tengo una TcpConnection usando mi ip local de 192.168.0.182. Entonces, si me gustaría saber la dirección MAC de esa NIC, llamaré al método como:
GetMacAddressUsedByIp("192.168.0.182")
fuente
Realmente odio desenterrar esta publicación anterior, pero creo que la pregunta merece otra respuesta específica para Windows 8-10.
Usando NetworkInformation del espacio de nombres Windows.Networking.Connectivity , puede obtener el Id. Del adaptador de red que Windows está usando. Luego puede obtener la dirección MAC de la interfaz de GetAllNetworkInterfaces () mencionado anteriormente.
Esto no funcionará en las aplicaciones de la Tienda Windows, ya que NetworkInterface en System.Net.NetworkInformation no expone GetAllNetworkInterfaces.
fuente
fuente
Cambió un poco su código blak3r. En caso de que tenga dos adaptadores con la misma velocidad. Ordenar por MAC, para que siempre obtenga el mismo valor.
fuente
fuente
ipconfig.exe
se implementa usando varias DLL, incluyendoiphlpapi.dll
... Google paraiphlpapi
revela una API Win32 correspondiente documentada en MSDN.fuente
Prueba esto:
fuente