Me gustaría poder leer la dirección MAC desde el primer adaptador de red activo usando VB.net o C# (usando .NET 3.5 SP1) para una aplicación winformLeer la dirección MAC del adaptador de red en .NET
Respuesta
es necesario DllImport GetAdaptersInfo - aquí hay algo de código C#
http://www.codeguru.com/cpp/i-n/network/networkinformation/comments.php/c5451/?thread=60212
de http://www.dotnetjunkies.com/WebLog/jkirwan/archive/2004/02/10/6943.aspx
Dim mc As System.Management.ManagementClass
Dim mo As ManagementObject
mc = New ManagementClass("Win32_NetworkAdapterConfiguration")
Dim moc As ManagementObjectCollection = mc.GetInstances()
For Each mo In moc
If mo.Item("IPEnabled") = True Then
ListBox1.Items.Add("MAC address " & mo.Item("MacAddress").ToString())
End If
Next
estoy seguro de que lo ha No hay problema para portar este código a C# si necesita
¿Y qué ocurre si el portátil donde se ejecuta este código tiene el Adaptador de red deshabilitado? – Romias
Desde .Net 2.0 ha habido una clase NetworkInterface en el espacio de nombres System.Net.NetworkInformation que le proporcionará esta información. Prueba esto:
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
{
Console.WriteLine(nic.GetPhysicalAddress().ToString());
break;
}
}
Funciona muy bien. Sólo necesito cambiar if (nic.OperationalStatus == OperationalStatus.Up) – blak3r
¡Gracias, me ayuda! –
Aquí es una clase de hacer eso:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace MacAddress
{
class MacAddress
{
byte[] _address;
public MacAddress(byte[] b)
{
if (b == null)
throw new ArgumentNullException("b");
if (b.Length != 8)
throw new ArgumentOutOfRangeException("b");
_address = new byte[b.Length];
Array.Copy(b, _address, b.Length);
}
public byte[] Address { get { return _address; } }
public override string ToString()
{
return Address[0].ToString("X2", System.Globalization.CultureInfo.InvariantCulture) + ":" +
Address[1].ToString("X2", System.Globalization.CultureInfo.InvariantCulture) + ":" +
Address[2].ToString("X2", System.Globalization.CultureInfo.InvariantCulture) + ":" +
Address[3].ToString("X2", System.Globalization.CultureInfo.InvariantCulture) + ":" +
Address[4].ToString("X2", System.Globalization.CultureInfo.InvariantCulture) + ":" +
Address[5].ToString("X2", System.Globalization.CultureInfo.InvariantCulture);
}
public static List<MacAddress> GetMacAddresses()
{
int size = 0;
// this chunk of code teases out the first adapter info
int r = GetAdaptersInfo(null, ref size);
if ((r != IPConfigConst.ERROR_SUCCESS) && (r != IPConfigConst.ERROR_BUFFER_OVERFLOW))
{
return null;
}
Byte[] buffer = new Byte[size];
r = GetAdaptersInfo(buffer, ref size);
if (r != IPConfigConst.ERROR_SUCCESS)
{
return null;
}
AdapterInfo Adapter = new AdapterInfo();
ByteArray_To_IPAdapterInfo(ref Adapter, buffer, Marshal.SizeOf(Adapter));
List<MacAddress> addresses = new List<MacAddress>();
do
{
addresses.Add(new MacAddress(Adapter.Address));
IntPtr p = Adapter.NextPointer;
if (p != IntPtr.Zero)
{
IntPtr_To_IPAdapterInfo(ref Adapter, p, Marshal.SizeOf(Adapter));
}
else
{
break;
}
} while (true);
return addresses;
}
// glue definitions into windows
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct IPAddrString
{
public IntPtr NextPointer;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4 * 4)]
public String IPAddressString;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4 * 4)]
public String IPMaskString;
public int Context;
}
private class IPConfigConst
{
public const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
public const int MAX_ADAPTER_NAME_LENGTH = 256;
public const int MAX_ADAPTER_ADDRESS_LENGTH = 8;
public const int ERROR_BUFFER_OVERFLOW = 111;
public const int ERROR_SUCCESS = 0;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct AdapterInfo
{
public IntPtr NextPointer;
public int ComboIndex;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IPConfigConst.MAX_ADAPTER_NAME_LENGTH + 4)]
public string AdapterName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IPConfigConst.MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]
public string Description;
public int AddressLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = IPConfigConst.MAX_ADAPTER_ADDRESS_LENGTH)]
public Byte[] Address;
public int Index;
public int Type;
public int DhcpEnabled;
public IntPtr CurrentIPAddress;
public IPAddrString IPAddressList;
public IPAddrString GatewayList;
public IPAddrString DhcpServer;
public Boolean HaveWins;
public IPAddrString PrimaryWinsServer;
public IPAddrString SecondaryWinsServer;
public int LeaseObtained;
public int LeaseExpires;
}
[DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]
private static extern int GetAdaptersInfo(Byte[] PAdapterInfoBuffer, ref int size);
[DllImport("Kernel32.dll", EntryPoint = "CopyMemory")]
private static extern void ByteArray_To_IPAdapterInfo(ref AdapterInfo dst, Byte[] src, int size);
[DllImport("Kernel32.dll", EntryPoint = "CopyMemory")]
private static extern void IntPtr_To_IPAdapterInfo(ref AdapterInfo dst, IntPtr src, int size);
}
}
Y aquí hay algo de código de prueba:
List<MacAddress> addresses = MacAddress.GetMacAddresses();
foreach (MacAddress address in addresses)
{
Console.WriteLine(address);
}
Estoy seguro de que el método ToString podría ser mejor, pero hace el trabajo.
using Linq..
using System.Net.NetworkInformation;
..
NetworkInterface nic =
NetworkInterface.GetAllNetworkInterfaces()
.Where(n => n.OperationalStatus == OperationalStatus.Up).FirstOrDefault();
if (nic != null)
return nic.GetPhysicalAddress().ToString();
Parece que este es un antiguo puesto, pero sé que va a encontrarse con este hilo en busca de ayuda, así que aquí es lo que hice hoy para conseguir las direcciones MAC de todas las interfaces de red en mi portátil.
En primer lugar usted tiene que importar los siguientes
Imports System.Net.NetworkInformation
Ésta es la función que devuelve todas las direcciones MAC en una matriz de cadenas
Private Function GetMAC() As String()
Dim MACAddresses(0) As String
Dim i As Integer = 0
Dim NIC As NetworkInterface
For Each NIC In NetworkInterface.GetAllNetworkInterfaces
ReDim Preserve MACAddresses(i)
MACAddresses(i) = String.Format("{0}", NIC.GetPhysicalAddress())
i += 1
Next
Return MACAddresses
End Function
Para cualquier persona que utilice el Compact Framework más limitada (.NET v2.0 CF) el siguiente código funciona tanto en Windows CE 5.0 como en CE 6.0 (leyendo solo el nombre del adaptador, pero busca "typedef struct _IP_ADAPTER_INFO" en MSDN para obtener la definición completa de la estructura devuelta):
private const int MAX_ADAPTER_NAME_LENGTH = 256;
[DllImport ("iphlpapi.dll", SetLastError = true)]
private static extern int GetAdaptersInfo(byte[] abyAdaptor, ref int nSize);
// ...
private static string m_szAdaptorName = "DM9CE1";
// ...
private void GetNetworkAdaptorName()
{
// The initial call is to determine the size of the memory required. This will fail
// with the error code "111" which is defined by MSDN to be "ERROR_BUFFER_OVERFLOW".
// The structure size should be 640 bytes per adaptor.
int nSize = 0;
int nReturn = GetAdaptersInfo(null, ref nSize);
// Allocate memory and get data
byte[] abyAdapatorInfo = new byte[nSize];
nReturn = GetAdaptersInfo(abyAdapatorInfo, ref nSize);
if (nReturn == 0)
{
// Find the start and end bytes of the name in the returned structure
int nStartNamePos = 8;
int nEndNamePos = 8;
while ((abyAdapatorInfo[nEndNamePos] != 0) &&
((nEndNamePos - nStartNamePos) < MAX_ADAPTER_NAME_LENGTH))
{
// Another character in the name
nEndNamePos++;
}
// Convert the name from a byte array into a string
m_szAdaptorName = Encoding.UTF8.GetString(
abyAdapatorInfo, nStartNamePos, (nEndNamePos - nStartNamePos));
}
else
{
// Failed? Use a hard-coded network adaptor name.
m_szAdaptorName = "DM9CE1";
}
}
- 1. ¿Cómo obtener la dirección MAC de la interfaz de red WiFi?
- 2. ¿Cómo obtener el índice del adaptador de red?
- 3. Obteniendo la dirección base del proceso en Mac OSX
- 4. Obteniendo la dirección MAC
- 5. Diferenciar el adaptador de red VMware de los adaptadores físicos de red -o-- Detectar el adaptador de red virtual
- 6. Obtener una dirección MAC de máquinas en la red local desde su IP en C#
- 7. C++: ¿Obtener la dirección MAC de los adaptadores de red en Vista?
- 8. IOException: El adaptador de red no pudo establecer la conexión
- 9. Determinar Red Tipo de adaptador a través de WMI
- 10. Configuración de la prioridad métrica del adaptador de red en Windows 7
- 11. BSSID vs dirección MAC?
- 12. Obtención de la dirección MAC de la máquina: ¿buena solución?
- 13. ¿Cómo obtener la dirección MAC de hardware en Windows
- 14. Recuperando la dirección IP del Proxy Mac OS X
- 15. ¿Cómo obtener una dirección IP desde la dirección Mac mediante programación en Android?
- 16. Buscar host con dirección MAC usando Python
- 17. Descubrimiento de red en una Mac
- 18. Obtener una dirección MAC remota a través de IPv6
- 19. Java - encuentre el host por la dirección MAC
- 20. Obtener la dirección MAC de dispositivos usando Python
- 21. dirección de formato MAC en C#
- 22. php/ajax REMOTE_ADDR configurado como IP del adaptador de red falso
- 23. Mensajería en la red local con .NET
- 24. Obtiene la dirección de correo electrónico del usuario actual en .NET
- 25. Cómo determinar qué adaptador de red está conectado a Internet
- 26. comando script/Powershell para restablecer un adaptador de red
- 27. Analizando la dirección IP en .NET
- 28. ¿Cómo obtener la dirección IP del usuario usando .net?
- 29. Dirección MAC de la interfaz en OS X (C)
- 30. ¿Cómo puedo obtener una dirección MAC de una solicitud HTTP?
Hola Lou, deberías consultar conmigo antes de publicar el código real. -Steve – plinth