Есть ли способ получить только MAC-адрес Ethernet через командную строку в Windows?

Есть ли способ получить только MAC-адрес Ethernet через командную строку в Windows?

Я использую ipconfig /allили getmac /vдля получения всех физических адресов сетевых карт.

Но проблема в том, что обычно компьютер имеет более одной сетевой карты. Также есть некоторые виртуальные MAC-адреса, например Microsoft Virtual Wi-Fi hotspot NIC, которые отображаются только при включенной точке доступа Wi-Fi.

Итак, как мне получить только адрес, соответствующий Ethernet, через командную строку?

вывод: (используя getmac /fo csv /vи выключив точку доступа Wi-Fi)

"Connection Name","Network Adapter","Physical Address","Transport Name" "Ethernet","Realtek PCIe FE Family Controller","A0-2B-B8-27-62-12","\Device\Tcpi p_{F1FF9AF6-AD1A-4C5E-8717-C646C9AE466C}" "Wi-Fi","Qualcomm Atheros QCA9565 802.11b/g/n WiFi Adapter","28-E3-47-D2-FB-60", "Media disconnected"

вывод: (используя getmac /fo csv /vи точку доступа Wi-Fi ВКЛ)

"Connection Name","Network Adapter","Physical Address","Transport Name" "Ethernet","Realtek PCIe FE Family Controller","A0-2B-B8-27-62-12","\Device\Tcpi p_{F1FF9AF6-AD1A-4C5E-8717-C646C9AE466C}" "Wi-Fi","Qualcomm Atheros QCA9565 802.11b/g/n WiFi Adapter","28-E3-47-D2-FB-60", "Media disconnected" "Local Area Connection* 7","Microsoft Hosted Network Virtual Adapter","4A-E3-47- D2-FB-60","\Device\Tcpip_{630B2924-03A8-41C1-B1F2-D981A4C263C6}"

Список всех моих адаптеров: (wmic nic) http://pastebin.com/zyz9LjJe

ОБНОВЛЯТЬ (возможное решение): Ответы @DavidPostill и @wmz мне очень помогли. Наконец-то я нашел решение, как исключить все виртуальные адаптеры с виртуальным MAC-адресом. x2-xx-xx-xx-xx-xx x6-xx-xx-xx-xx-xx xA-xx-xx-xx-xx-xx xE-xx-xx-xx-xx-xx

MAC-адреса с этими диапазонами чаще всего используются виртуальными MAC-адаптерами. https://serverfault.com/questions/40712/какой-диапазон-mac-адресов-я-могу-безопасно-использовать-для-моих-виртуальных-машин

Итак, получив все MAC-адреса getmacкомандой, мы можем отфильтровать эти виртуальные MAC-адреса с помощью регулярного выражения. Более того, мы замечаем, что фильтрация MAC по "wi-fi" более надежна, чем фильтрация по "локальному подключению". Поэтому мы отфильтровываем соединения с "wi-fi" в их именах, чтобы получить окончательное соединение LAN/Ethernet.

решение1

Есть ли способ получить только MAC-адрес Ethernet через командную строку?

Вы можете сделать то, что вам нужно, используя однострочную (но сложную) последовательность встроенных команд.

Из командной строки:

for /f "usebackq tokens=3 delims=," %a in (`getmac /fo csv /v ^| find "Local Area Connection"`) do set MAC=%~a

Из пакетного файла:

for /f "usebackq tokens=3 delims=," %%a in (`getmac /fo csv /v ^| find "Local Area Connection"`) do set MAC=%%~a

Как это работает?

Мы можем использовать:

getmac /fo csv /v

Чтобы получить адрес управления доступом к среде передачи данных (MAC) и список сетевых протоколов, связанных с каждым адресом для всех локальных сетевых карт.

Используйте /vопцию для получения подробного вывода (включая «Имя подключения»). «Имя подключения» понадобится позже, чтобы мы могли определить, какой адаптер является подключением Ethernet:

"Connection Name","Network Adapter","Physical Address","Transport Name"
"Local Area Connection","Realtek PCIe GBE Family Controller","F0-BF-97-62-95-5D","\Device\Tcpip_{45B9E87F-83FB-4829-A751-6B62656CC1A8}"
"Wireless Network Connection","Atheros AR9285 Wireless Network Adapter","CC-AF-78-B2-4C-09","\Device\Tcpip_{B108BB0B-CCDC-4ACA-9DFE-5A2F17BC138D}"
"Bluetooth Network Connection","Bluetooth Device (Personal Area Network)","CC-AF-78-B2-4C-0A","Media disconnected"

Если мы передадим |этот вывод по каналу, то findсможем извлечь информацию только для Ethernetсоединения (имя которого «Подключение по локальной сети»):

getmac /fo csv /v ^| find "Local Area Connection"

Возвращает информацию «Подключение по локальной сети» в формате CSV (с разделителями-запятыми) следующим образом:

"Local Area Connection","Realtek PCIe GBE Family Controller","F0-BF-97-62-95-5D","\Device\Tcpip_{45B9E87F-83FB-4829-A751-6B62656CC1A8}"

Третье значение (разделенное запятой) — это MAC-адрес.

Теперь мы используем forкоманду для извлечения только MAC-адреса из указанной выше строки.

Строка передается команде for(используя `символ (обратная кавычка) вместе с usebackq):

for /f "usebackq tokens=3 delims=," %a in (`string`) do

Возвращает 3-й токен (значение) из запятой, разделенной stringследующим образом:

"F0-BF-97-62-95-5D"

%~aиспользуется для удаления кавычек из строки, оставляя:

F0-BF-97-62-95-5D

Наконец, переменная MACустанавливается в следующее значение F0-BF-97-62-95-5D:

set MAC=%~a

Обратите внимание, что в пакетном файле каждый элемент %необходимо заменить на %%.


Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD- Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • находить- Поиск текстовой строки в файле и отображение всех строк, где она найдена.
  • для /ф- Циклическая команда по результатам другой команды.
  • getmac- Отображение адреса управления доступом к среде передачи данных (MAC) и списка сетевых протоколов, связанных с каждым адресом для всех сетевых карт на каждом компьютере, как локально, так и в сети.
  • параметры- Аргумент командной строки (или параметр) — это любое значение, переданное в пакетный скрипт.
  • набор- Отображение, установка или удаление переменных среды CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.

решение2

С использованиемwmic

(Только интерфейсы, подключенные к Ethernet)

wmic nic where (AdapterTypeId=0 AND netConnectionStatus=2) get MACAddress

Дополнительная информация о доступных объектах недвижимости: https://msdn.microsoft.com/en-us/library/aa394216%28v=vs.85%29.aspx

Редактировать: Как заметил Дэвид, это также возвращает адаптер WiFi (который может быть или не быть тем, что хочет OP). Быстрый и грязный способ отфильтровать все, кроме LAN out (на основе имени соединения):

wmic nic where "NetConnectionId like '%Local Area%' and AdapterTypeId=0 AND netConnectionStatus=2" get MACAddress

решение3

В Powershell это можно сделать так (в Windows 8 есть командлет Get-NetAdapter, который отсутствует в Windows 7):

(get-wmiobject win32_networkadapter -Filter "AdapterType LIKE 'Ethernet 802.3'") | select -expand macaddress
11:22:33:45:04:1E

решение4

Кажется, я нашел немного более простое решение для записи MAC-адреса в файл.

@FOR /F %%i IN ('getmac /fo table /nh') DO ECHO %%i >> D:\mac.txt

получит MAC-адрес машины и запишет его в файл mac.txt, расположенный на диске D:

Объяснение кода: С помощью ключа /F мы указываем, что передаем в цикл @FOR команду 'getmac /fo table /nh' (указанную '') и присваиваем результат выполнения команды переменной i. Затем мы используем ECHO для записи значения переменной i в файл. Я использовал

getmac /fo table /nh

для получения более простого вывода, чем getmac /fo csv Вот как выглядит вывод getmac /fo table /nh

00-03-7F-50-5C-0D   \Device\Tcpip_{AD7B1C5C-5027-46A3-B693-95D01D7A0C6C}

Итак, нам нужно только передать эту строку в цикл @FOR, который по умолчанию в этом случае прочитает файл до первого пробела (не нужно определять специальные ключи) и присвоит прочитанное значение переменной i. Затем мы записываем ее значение в файл с помощью команды ECHO

 DO ECHO %%i >> D:\mac.txt

Обратите внимание, что >> добавит информацию в файл, а > перезапишет файл.

Связанный контент