
Eu uso ipconfig /all
ou getmac /v
para obter todos os endereços físicos da NIC.
Mas o problema é que geralmente um computador possui mais de uma placa NIC. Também existem alguns endereços MAC virtuais – como o ponto de acesso Wi-Fi virtual da Microsoft NIC – que são exibidos apenas quando o ponto de acesso Wi-Fi está ativado.
Então, como posso coletar apenas o endereço correspondente à Ethernet via prompt de comando?
saída: (usando getmac /fo csv /v
e hotspot wi-fi desligado)
"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"
saída: (usando getmac /fo csv /v
e hotspot wi-fi LIGADO)
"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}"
Lista de todos os meus adaptadores: (wmic nic) http://pastebin.com/zyz9LjJe
ATUALIZAR (solução possível): a resposta de @DavidPostill e @wmz me ajudou muito. finalmente consegui uma solução para eliminar todos os adaptadores virtuais com endereço MAC virtual.
x2-xx-xx-xx-xx-xx x6-xx-xx-xx-xx-xx xA-xx-xx-xx-xx-xx xE-xx-xx-xx-xx-xx
Endereços MAC com esses intervalos são mais usados por adaptadores MAC virtuais. https://serverfault.com/questions/40712/what-range-of-mac-addresses-can-i-safely-use-for-my-virtual-machines
Assim, depois de obter todos os endereços MAC por getmac
comando, podemos filtrar esses endereços MAC virtuais usando expressões regulares. Além disso, notamos que filtrar MAC por “wi-fi” é mais confiável do que filtrar por “conexão local”. Portanto, filtramos as conexões com "wi-fi" em seus nomes para obter a conexão LAN/Ethernet final.
Responder1
Existe uma maneira de obter apenas o endereço MAC Ethernet via prompt de comando?
Você pode fazer o que precisa usando uma sequência de uma linha (mas complicada) de comandos integrados.
Na linha de comando:
for /f "usebackq tokens=3 delims=," %a in (`getmac /fo csv /v ^| find "Local Area Connection"`) do set MAC=%~a
De um arquivo em lote:
for /f "usebackq tokens=3 delims=," %%a in (`getmac /fo csv /v ^| find "Local Area Connection"`) do set MAC=%%~a
Como funciona?
Podemos usar:
getmac /fo csv /v
Para obter o endereço Media Access Control (MAC) e a lista de protocolos de rede associados a cada endereço para todas as placas de rede local.
Use a /v
opção para obter saída detalhada (que inclui o "Nome da conexão"). O "Nome da Conexão" será necessário posteriormente para que possamos identificar qual adaptador é a Ethernet
conexão:
"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"
Se canalizarmos |
essa saída, find
podemos extrair as informações apenas para a Ethernet
conexão (que tem o nome de conexão "Conexão de área local"):
getmac /fo csv /v ^| find "Local Area Connection"
Retorna as informações de "Conexão Local" no formato csv (delimitado por vírgula) da seguinte forma:
"Local Area Connection","Realtek PCIe GBE Family Controller","F0-BF-97-62-95-5D","\Device\Tcpip_{45B9E87F-83FB-4829-A751-6B62656CC1A8}"
O terceiro valor (delimitado por vírgula) é o endereço MAC.
Agora usamos o for
comando para extrair apenas o endereço MAC da string acima.
A string é passada para o for
comando (usando o `caractere (aspas crases) junto com usebackq
:
for /f "usebackq tokens=3 delims=," %a in (`string`) do
Retorna o terceiro token (valor) delimitado por vírgula string
da seguinte forma:
"F0-BF-97-62-95-5D"
%~a
é usado para remover as aspas da string, deixando:
F0-BF-97-62-95-5D
Finalmente a variável MAC
é definida como F0-BF-97-62-95-5D
:
set MAC=%~a
Observe que em um arquivo em lote cada %
deve ser substituído por %%
.
Leitura adicional
- Um índice AZ da linha de comando do Windows CMD- Uma excelente referência para todas as coisas relacionadas à linha cmd do Windows.
- encontrar- Procure uma string de texto em um arquivo e exiba todas as linhas onde ela for encontrada.
- para /f- Comando de loop em relação aos resultados de outro comando.
- getmac- Exibe o endereço MAC (Media Access Control) e a lista de protocolos de rede associados a cada endereço para todas as placas de rede em cada computador, localmente ou através de uma rede.
- parâmetros- Um argumento (ou parâmetro) de linha de comando é qualquer valor passado para um script em lote.
- definir- Exibir, definir ou remover variáveis de ambiente CMD. As alterações feitas com SET permanecerão apenas durante a sessão CMD atual.
Responder2
Usandowmic
(Somente interfaces conectadas via Ethernet)
wmic nic where (AdapterTypeId=0 AND netConnectionStatus=2) get MACAddress
Mais informações sobre os imóveis disponíveis: https://msdn.microsoft.com/en-us/library/aa394216%28v=vs.85%29.aspx
Editar: como David observou, isso também retorna o adaptador WiFi (que pode ou não ser o que o OP deseja). Maneira rápida e suja de filtrar qualquer coisa que não seja LAN (com base no nome da conexão):
wmic nic where "NetConnectionId like '%Local Area%' and AdapterTypeId=0 AND netConnectionStatus=2" get MACAddress
Responder3
No Powershell você faria assim (o Windows 8 apresenta o cmdlet Get-NetAdapter que não vem com o Windows 7):
(get-wmiobject win32_networkadapter -Filter "AdapterType LIKE 'Ethernet 802.3'") | select -expand macaddress
11:22:33:45:04:1E
Responder4
Parece que encontrei uma solução um pouco mais simples para escrever o endereço MAC em um arquivo
@FOR /F %%i IN ('getmac /fo table /nh') DO ECHO %%i >> D:\mac.txt
irá obter o endereço MAC da máquina e gravá-lo no arquivo mac.txt localizado no disco D:
Explicação do código: Com a tecla /F especificamos que passamos para o ciclo @FOR um comando 'getmac /fo table /nh' (especificado por '') e atribuímos o resultado da execução do comando à variável i. Então usamos ECHO para escrever o valor da variável i no arquivo. eu usei
getmac /fo table /nh
para obter uma saída mais simples que getmac /fo csv É assim que a saída de getmac /fo table /nh se parece
00-03-7F-50-5C-0D \Device\Tcpip_{AD7B1C5C-5027-46A3-B693-95D01D7A0C6C}
Então, só precisamos passar esta string para o ciclo @FOR que, por padrão, neste caso, irá ler o arquivo antes do primeiro espaço (não há necessidade de definir chaves especiais) e atribuir o valor de leitura à variável i. Então escrevemos seu valor no arquivo com o comando ECHO
DO ECHO %%i >> D:\mac.txt
Observe que >> adicionará informações ao arquivo, enquanto > substituirá o arquivo.