J'ai besoin d'un moyen d'obtenir l'adresse MAC d'une machine quel que soit le système d'exploitation qu'elle exécute en utilisant C #. L'application devra fonctionner sur XP / Vista / Win7 32 et 64 bits ainsi que sur ces systèmes d'exploitation mais avec une langue étrangère par défaut. De nombreuses commandes C # et requêtes de système d'exploitation ne fonctionnent pas sur tous les systèmes d'exploitation. Des idées? J'ai gratté la sortie de "ipconfig / all" mais c'est terriblement peu fiable car le format de sortie diffère sur chaque machine.
Merci
Réponses:
Solution plus propre
Ou:
la source
return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();
(Si ce n'est pas votre truc, ça devrait être votre truc.)var networks = NetworkInterface.GetAllNetworkInterfaces(); var activeNetworks = networks.Where(ni => ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback); var sortedNetworks = activeNetworks.OrderByDescending(ni => ni.Speed); return sortedNetworks.First().GetPhysicalAddress().ToString();
FirstOrDefault
avant la finaleSelect
. De cette façon, il n'obtiendrait que l'adresse physique et la sérialiserait pour ceNetworkInterface
que vous obtenez. N'oubliez pas d'ajouter le contrôle nul (?) Après leFirstOrDefault
.NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Voici un code C # qui renvoie l'adresse MAC de la première interface réseau opérationnelle. En supposant que l'
NetworkInterface
assembly est implémenté dans le runtime (c'est-à-dire Mono) utilisé sur d'autres systèmes d'exploitation, cela fonctionnerait sur d'autres systèmes d'exploitation.Nouvelle version: renvoie le NIC avec la vitesse la plus rapide qui a également une adresse MAC valide.
Version originale: renvoie simplement le premier.
La seule chose que je n'aime pas dans cette approche, c'est que si vous avez comme un Nortel Packet Miniport ou un type de connexion VPN, il a le potentiel 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 certain type d'interface réseau virtuelle.
la source
using System.Net.NetworkInformation;
La propriété MACAddress de la classe WMI Win32_NetworkAdapterConfiguration peut vous fournir l'adresse MAC d'un adaptateur. (Espace de noms System.Management)
Si vous n'êtes pas familier avec l'API WMI (Windows Management Instrumentation), vous trouverez ici un bon aperçu des applications .NET.
WMI est disponible dans toutes les versions de Windows avec le runtime .Net.
Voici un exemple de code:
la source
WMI est la meilleure solution si la machine à laquelle vous vous connectez est une machine Windows, mais si vous recherchez un linux, un mac ou un autre type d'adaptateur réseau, vous devrez utiliser autre chose. Voici quelques options:
Voici un échantillon de l'article n ° 3. Cela semble être la meilleure option si WMI n'est pas une solution viable:
Pour donner du crédit là où il est dû, voici la base de ce code: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#
la source
Nous utilisons WMI pour obtenir l'adresse mac de l'interface avec la métrique la plus basse, par exemple les fenêtres d'interface préféreront utiliser, comme ceci:
Ou dans Silverlight (nécessite une confiance accrue):
la source
la source
IMHO renvoyer la première adresse mac n'est pas une bonne idée, en particulier lorsque les machines virtuelles sont hébergées. Par conséquent, je vérifie la somme des octets envoyés / reçus et sélectionne la connexion la plus utilisée, qui n'est pas parfaite, mais devrait être correcte 9/10 fois.
la source
Cette méthode déterminera l'adresse MAC de l'interface réseau utilisée pour se connecter à l'url et au port spécifiés.
Toutes les réponses ici ne sont pas capables d'atteindre cet objectif.
J'ai écrit cette réponse il y a des années (en 2014). J'ai donc décidé de lui donner un petit "lifting". Veuillez consulter la section des mises à jour
Pour l'appeler, vous devez passer une URL pour vous connecter comme ceci:
Vous pouvez également spécifier un numéro de port. Si non spécifié, la valeur par défaut est 80.
MISES À JOUR:
2020
la source
Vous pouvez opter pour l'ID NIC:
Ce n'est pas l'adresse MAC, mais c'est un identifiant unique, si c'est ce que vous recherchez.
la source
J'aime vraiment la solution d'AVee avec la métrique de connexion IP la plus basse! Mais si une deuxième carte réseau avec la même métrique est installée, la comparaison MAC pourrait échouer ...
Mieux vaut stocker la description de l'interface avec le MAC. Dans les comparaisons ultérieures, vous pouvez identifier le bon nic par cette chaîne. Voici un exemple de code:
la source
disons que j'ai un TcpConnection utilisant mon adresse IP locale de 192.168.0.182. Ensuite, si je souhaite connaître l'adresse mac de cette carte réseau, j'appellerai le meothod comme suit:
GetMacAddressUsedByIp("192.168.0.182")
la source
Je déteste vraiment déterrer ce vieux message, mais je pense que la question mérite une autre réponse spécifique à Windows 8-10.
À l'aide de NetworkInformation à partir de l' espace de noms Windows.Networking.Connectivity , vous pouvez obtenir l'ID de la carte réseau que Windows utilise. Ensuite, vous pouvez obtenir l'adresse MAC de l'interface à partir des GetAllNetworkInterfaces () mentionnés précédemment.
Cela ne fonctionnera pas dans les applications du Windows Store car NetworkInterface dans System.Net.NetworkInformation n'expose pas GetAllNetworkInterfaces.
la source
la source
Blak3r a un peu changé son code. Au cas où vous auriez deux adaptateurs avec la même vitesse. Trier par MAC, de sorte que vous obtenez toujours la même valeur.
la source
la source
ipconfig.exe
est implémenté en utilisant diverses DLL, y comprisiphlpapi.dll
... Google pouriphlpapi
révèle une API Win32 correspondante documentée dans MSDN.la source
Essaye ça:
la source