Считать MAC-адрес из сетевого адаптера в.NET
Я хотел бы иметь возможность читать MAC-адрес с первого активного сетевого адаптера, используя VB.net или C# (используя.NET 3.5 SP1) для приложения winform
7 ответов
Начиная с.Net 2.0, в пространстве имен System.Net.NetworkInformation есть класс NetworkInterface, который предоставит вам эту информацию. Попробуй это:
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
{
Console.WriteLine(nic.GetPhysicalAddress().ToString());
break;
}
}
С 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
Я уверен, что у вас не будет проблем с переносом этого кода на C#, если вам нужно
using Linq..
using System.Net.NetworkInformation;
..
NetworkInterface nic =
NetworkInterface.GetAllNetworkInterfaces()
.Where(n => n.OperationalStatus == OperationalStatus.Up).FirstOrDefault();
if (nic != null)
return nic.GetPhysicalAddress().ToString();
Вот класс для этого:
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);
}
}
И вот некоторый тестовый код:
List<MacAddress> addresses = MacAddress.GetMacAddresses();
foreach (MacAddress address in addresses)
{
Console.WriteLine(address);
}
Я уверен, что метод ToString может быть лучше, но он делает свою работу.
Похоже, что это старый пост, но я знаю, что вы столкнетесь с этой темой в поисках помощи, поэтому вот что я сделал сегодня, чтобы получить MAC-адреса всех сетевых интерфейсов на моем ноутбуке.
Прежде всего, вы должны импортировать следующее
Imports System.Net.NetworkInformation
Это функция, которая возвращает все MAC-адреса в строковом массиве.
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
Вам нужно DllImport GetAdaptersInfo - вот код C#
http://www.codeguru.com/cpp/i-n/network/networkinformation/comments.php/c5451/?thread=60212
Для тех, кто использует более ограниченную Compact Framework (.NET v2.0 CF), следующий код работает как в Windows CE 5.0, так и в CE 6.0 (считывая только имя адаптера, но ищите "typedef struct _IP_ADAPTER_INFO" в MSDN, чтобы получить полное определение возвращенной структуры):
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";
}
}