Voici un code C# qui renvoie l'adresse MAC de la première interface réseau opérationnelle. En supposant que le NetworkInterface
est mis en œuvre dans le moteur d'exécution (c'est-à-dire Mono) utilisé sur d'autres systèmes d'exploitation, alors cela fonctionnera sur d'autres systèmes d'exploitation.
Nouvelle version : renvoie la NIC avec la vitesse la plus rapide qui a aussi une adresse MAC valide.
/// <summary>
/// Finds the MAC address of the NIC with maximum speed.
/// </summary>
/// <returns>The MAC address.</returns>
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;
}
Version originale : renvoie simplement la première.
/// <summary>
/// Finds the MAC address of the first operation NIC found.
/// </summary>
/// <returns>The MAC address.</returns>
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;
}
La seule chose que je n'aime pas dans cette approche, c'est que si vous disposez d'un miniport Nortel Packet ou d'un type de connexion VPN, vous risquez d'être choisi. Pour autant que je sache, il n'y a aucun moyen de distinguer le MAC d'un périphérique physique réel d'un type d'interface réseau virtuelle.