Оригинал здесь
Эта статья рассказывает, как узнать, какой IP адрес имеет сетевое устройство с известным MAC адресом.
Этот вопрос чаще возникает для сетевых устройств, таких как сетевые принтеры или сетевые телекамеры. Например, мы подключили сетевой принтер или сетевую телекамеру к сети с DHCP и хотим узнать IP адрес этого устройства, но доступа к статистике DHCP сервера нет. Или на устройстве задан статический IP адрес, но мы не помним, какой именно. При этом мы знаем MAC адрес (написан на корпусе). Этот вопрос бывает актуален и для компьютеров, особенно к которым нет физического доступа.
Консольные команды определения IP адреса представлены на картинке, а далее описано, почему команды должны быть именно такими и как они работают, также приведён пример bat файла:
Способ работает на любом Windows компьтере в сети и не требует административных полномочий. Используется информация ARP кэша, производится чтение списка и поиск нужной записи.
Просмотр ARP кэша
Командная строка просмотра ARP кэша с поиском записи по определённому MAC адресу:
1 |
arp -a | find /i "01-23-45-67-89-ab" |
Но, выполнив эту команду, мы можем не увидеть наше устройство.
Это происходит потому, что ARP кэш в Windows хранит записи от 15 до 45 секунд, начиная с Windows Vista: Address Resolution Protocol (ARP) caching behavior in Windows Vista TCP/IP implementations.
Наполнение ARP кэша
Поэтому перед чтением кэша необходимо заполнить его полным списком узлов сети. Это можно сделать, запустив ping на все узлы сети, например, если у нас сеть 192.168.1.1 / 255.255.255.0, то:
1 |
for /L %a in (1,1,254) do @start /b ping 192.168.1.%a -n 2 > nul |
Важно, чтобы запуск ping’ов происходил как do @start /b ping, тогда
- все ping’и запускаются почти одновременно, и время выполнения цикла составит всего несколько секунд. Если написать просто do ping, т.е. без start, то цикл будет выполняться более 10 минут.
- значок @ перед start предотвращает вывод 254 команд ping
После завершения ping’ов нужно сразу запускать arp -a. Пауза более 15 секунд может привести к тому, что какие-то записи будут удалены из кэша.
Пакетный bat/cmd файл
То же решение в виде командного файла ip_by_mac.cmd с передачей MAC адреса в виде параметра будет выглядеть так:
1 2 3 4 5 |
@echo off if "%1" == "" echo no MAC address & exit /b 1 for /L %%a in (1,1,254) do @start /b ping 192.168.1.%%a -n 2 > nul ping 127.0.0.1 -n 3 > nul arp -a | find /i "%1" |
Соответственно, запускаем:
1 |
ip_by_mac 01-23-45-67-89-ab |
и получаем:
1 |
192.168.1.221 01-23-45-67-89-ab динамический |
Ограничения
Способ работает только для тех узлов, которые отвечают на ping (icmp запросы), т.е. если у компьютера icmp echo отключен, то этот командный файл не определит его IP адрес.
Остается неудобство в том, что требуется явно указывать подсеть, а так же ограничение на подсеть – командный файл работает только для сетей 255.255.255.0.