6

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

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

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

вывод: (с использованием getmac /fo csv /v и точки доступа wifi OFF)

"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 и точку доступа wifi)

"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/what-range-of-mac-addresses-can-i-safely-use-for-my-virtual-machines

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

3 ответа3

8

Есть ли способ получить только 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

Получить адрес Media Access Control (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.
  • find - поиск текстовой строки в файле и отображение всех строк, где она найдена.
  • for /f - Циклическая команда против результатов другой команды.
  • getmac - отображает адрес Media Access Control (MAC) и список сетевых протоколов, связанных с каждым адресом, для всех сетевых карт на каждом компьютере, локально или через сеть.
  • параметры - аргумент командной строки (или параметр) - это любое значение, переданное в пакетный скрипт.
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
5

Используя 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). Быстрый и грязный способ отфильтровать что-либо, кроме выхода из локальной сети (на основе имени подключения):

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

2

В 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .