Oto kod w języku C #, który zwraca adres MAC pierwszego działającego interfejsu sieciowego. Zakładając, że NetworkInterface
zestaw jest zaimplementowany w środowisku uruchomieniowym (tj. Mono) używanym w innych systemach operacyjnych, to działałoby w innych systemach operacyjnych.
Nowa wersja: zwraca kartę sieciową z największą szybkością, która ma również prawidłowy adres MAC.
private string GetMacAddress()
{
const int MIN_MAC_ADDR_LENGTH = 12;
string macAddress = string.Empty;
long maxSpeed = -1;
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
log.Debug(
"Found MAC Address: " + nic.GetPhysicalAddress() +
" Type: " + nic.NetworkInterfaceType);
string tempMac = nic.GetPhysicalAddress().ToString();
if (nic.Speed > maxSpeed &&
!string.IsNullOrEmpty(tempMac) &&
tempMac.Length >= MIN_MAC_ADDR_LENGTH)
{
log.Debug("New Max Speed = " + nic.Speed + ", MAC: " + tempMac);
maxSpeed = nic.Speed;
macAddress = tempMac;
}
}
return macAddress;
}
Wersja oryginalna: po prostu zwraca pierwszą.
private string GetMacAddress()
{
string macAddresses = string.Empty;
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
{
macAddresses += nic.GetPhysicalAddress().ToString();
break;
}
}
return macAddresses;
}
Jedyne, co mi się nie podoba w tym podejściu, to to, że jeśli masz np. Nortel Packet Miniport lub jakiś rodzaj połączenia VPN, może on zostać wybrany. O ile wiem, nie ma sposobu, aby odróżnić adres MAC rzeczywistego urządzenia fizycznego od pewnego typu interfejsu sieci wirtualnej.