Мне нужен способ получить MAC-адрес машины независимо от ОС, в которой он работает, с использованием C #. Приложение должно работать на XP / Vista / Win7 32 и 64 бит, а также на этих ОС, но с иностранным языком по умолчанию. Многие команды C # и запросы ОС не работают в ОС. Любые идеи? Я очищал вывод «ipconfig / all», но это ужасно ненадежно, так как формат вывода отличается на каждой машине.
Спасибо
Ответы:
Более чистое решение
Или:
источник
return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();
(Если это не ваша вещь, она должна быть вашей.)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
до финалаSelect
. Таким образом, он получит только физический адрес и сериализует его по фактическому полученномуNetworkInterface
вами адресу . Не забудьте добавить нулевую отметку (?) ПослеFirstOrDefault
.NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Вот код C #, который возвращает MAC-адрес первого рабочего сетевого интерфейса. Предполагая, что
NetworkInterface
сборка реализована в среде выполнения (например, Mono), используемой в других операционных системах, это будет работать в других операционных системах.Новая версия: возвращает сетевой адаптер с максимальной скоростью, который также имеет действующий MAC-адрес.
Исходная версия: просто возвращает первую.
Единственное, что мне не нравится в этом подходе, это то, что если у вас есть вроде Nortel Packet Miniport или какой-то тип VPN-соединения, он может быть выбран. Насколько я могу судить, нет способа отличить MAC реального физического устройства от виртуального сетевого интерфейса какого-либо типа.
источник
using System.Net.NetworkInformation;
MACADDRESS свойство класса Win32_NetworkAdapterConfiguration WMI может предоставить вам MAC - адрес закрепительного в. (Пространство имен System.Management)
Если вы не знакомы с WMI API (инструментарий управления Windows), здесь есть хороший обзор приложений .NET.
WMI доступен во всех версиях окон со средой выполнения .Net.
Вот пример кода:
источник
WMI - лучшее решение, если машина, к которой вы подключаетесь, является машиной Windows, но если вы смотрите на сетевой адаптер linux, mac или другой тип, вам нужно будет использовать что-то еще. Вот несколько вариантов:
Вот образец предмета №3. Это кажется лучшим вариантом, если WMI не является жизнеспособным решением:
Чтобы отдать должное, где это необходимо, это основа для этого кода: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#
источник
Мы используем WMI, чтобы получить MAC-адрес интерфейса с наименьшей метрикой, например, окна интерфейса предпочтут использовать, например:
Или в Silverlight (требуется повышенное доверие):
источник
источник
ИМХО, возвращение первого MAC-адреса не является хорошей идеей, особенно когда размещены виртуальные машины. Поэтому я проверяю сумму отправленных / полученных байтов и выбираю наиболее часто используемое соединение, которое не идеально, но должно быть правильным 9/10 раз.
источник
Этот метод определит MAC-адрес сетевого интерфейса, используемого для подключения к указанному URL-адресу и порту.
Все ответы здесь не способны достичь этой цели.
Я написал этот ответ много лет назад (в 2014 году). Поэтому я решил немного "подтянуть лицо". Пожалуйста, посмотрите раздел обновлений
Чтобы вызвать его, вам нужно передать URL-адрес для подключения следующим образом:
Вы также можете указать номер порта. Если не указано иное, значение по умолчанию - 80.
ОБНОВЛЕНИЕ:
2020
источник
Вы можете использовать NIC ID:
Это не MAC-адрес, но это уникальный идентификатор, если это то, что вы ищете.
источник
Мне очень нравится решение AVee с самой низкой метрикой IP-соединения! Но если будет установлен второй nic с той же метрикой, сравнение MAC может не сработать ...
Лучше храни описание интерфейса с MAC. В более поздних сравнениях вы можете определить правильный ник по этой строке. Вот пример кода:
источник
скажем, у меня есть TcpConnection, использующий мой локальный IP-адрес 192.168.0.182. Затем, если я захочу узнать MAC-адрес этого сетевого адаптера, я назову метод следующим образом:
GetMacAddressUsedByIp("192.168.0.182")
источник
Мне действительно неприятно раскапывать этот старый пост, но я считаю, что этот вопрос заслуживает другого ответа, относящегося к Windows 8-10.
Используя NetworkInformation из пространства имен Windows.Networking.Connectivity , вы можете получить идентификатор используемого окнами сетевого адаптера. Затем вы можете получить MAC-адрес интерфейса из ранее упомянутого GetAllNetworkInterfaces ().
Это не будет работать в приложениях Магазина Windows, поскольку NetworkInterface в System.Net.NetworkInformation не предоставляет GetAllNetworkInterfaces.
источник
источник
Немного изменил свой код blak3r. Если у вас есть два адаптера с одинаковой скоростью. Сортируйте по MAC, чтобы всегда получать одно и то же значение.
источник
источник
ipconfig.exe
реализован с использованием различных DLL, включаяiphlpapi.dll
... Поиск в Googleiphlpapi
обнаруживает соответствующий API Win32, задокументированный в MSDN.источник
Попробуй это:
источник