Получить MAC-адрес от шлюза по умолчанию?
Есть ли способ разрешить MAC-адрес от шлюза по умолчанию с помощью C#?
обновить я работаю с
var x = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses;
но я чувствую, что что-то упустил.
3 ответа
То, что вы действительно хотите, это выполнить запрос протокола ARP. Есть хорошие и не очень хорошие способы сделать это.
- Используйте существующий метод в.NET Framework (хотя я сомневаюсь, что он существует)
- Напишите свой собственный метод запроса ARP (вероятно, больше работы, чем вы ищете)
- Использовать управляемую библиотеку (если существует)
- Использовать неуправляемую библиотеку (например, iphlpapi.dll, как предложено Кевином)
- Если вы знаете, что вам нужен только удаленный доступ, чтобы получить MAC-адрес удаленного компьютера Windows в вашей сети, вы можете использовать инструментарий управления Windows (WMI).
Пример WMI:
using System;
using System.Management;
namespace WMIGetMacAdr
{
class Program
{
static void Main(string[] args)
{
ManagementScope scope = new ManagementScope(@"\\localhost"); // TODO: remote computer (Windows WMI enabled computers only!)
//scope.Options = new ConnectionOptions() { Username = ... // use this to log on to another windows computer using a different l/p
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject obj in searcher.Get())
{
string macadr = obj["MACAddress"] as string;
string[] ips = obj["IPAddress"] as string[];
if (ips != null)
{
foreach (var ip in ips)
{
Console.WriteLine("IP address {0} has MAC address {1}", ip, macadr );
}
}
}
}
}
}
Нечто подобное должно работать для вас, хотя вы, вероятно, захотите добавить дополнительную проверку ошибок:
[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(uint destIP, uint srcIP, byte[] macAddress, ref uint macAddressLength);
public static byte[] GetMacAddress(IPAddress address)
{
byte[] mac = new byte[6];
uint len = (uint)mac.Length;
byte[] addressBytes = address.GetAddressBytes();
uint dest = ((uint)addressBytes[3] << 24)
+ ((uint)addressBytes[2] << 16)
+ ((uint)addressBytes[1] << 8)
+ ((uint)addressBytes[0]);
if (SendARP(dest, 0, mac, ref len) != 0)
{
throw new Exception("The ARP request failed.");
}
return mac;
}
Вы, вероятно, должны будете использовать P/Invoke и некоторые собственные функции Win API.
Взгляните на этот урок.