четверг, 27 августа 2015 г.

Powershell. Как узнать аппаратный адрес другого компьютера

  После статьи как узнать свой аппаратный адрес средствами Powershell, встал следующий вопрос - как узнать аппаратный адрес другого компа в локальной сети по его IP.
  Я не нашел командлета Powershell который прямо делает это. Поэтому пришлось выкручиваться так.
  В каждом компе есть своя ARP-таблица содержащая связку IP и соответствующий ему физический адрес (смотри команду "arp -a"). В ней хранятся не все компы сети, а только те к которым ваша машина недавно связывалась. Подробности смотри описание ARP протокола. Надо любым способом связаться с нужным компом (просмотреть его открытые в сеть папки, послать на его принтер задание, просто послать любой сетевой пакет) чтобы предварительно ARP-протокол занес в таблицу нужный нам IP и его физический адрес. Потом из ARP-таблицы по известному IP находим то что надо.

   Реализуя этот алгоритм, оказалось что Windows не заносит в таблицу свой собственный физ адрес. В отличие от Linux-a. Поэтому скрипт должен в этом случае найти его другими методами.
  Таким способом можно узнать аппаратный адрес компов в одной подсети с тобой. Компы за шлюзом так не обследуешь. Когда я хотел получить MAC машины за шлюзом, то функция возвратила пустую строку.
  Реализовано это так:

Function Get-MAC ($IP) {
  $This_IP=((Get-NetIPConfiguration).IPv4Address).IPv4Address
  if ($IP -eq $This_IP) {
    $InterfaceAlias=(Get-NetIPConfiguration).InterfaceAlias
    $This_HWAddr=(Get-NetAdapter | Where-Object{$_.ifAlias -eq $InterfaceAlias}).MACAddress
    $HW_Addr=$This_HWAddr
  } else {
    ping -n 1 -w 2000 $IP > $Null
    $Cmd_Arp_Out=arp -a | Where-Object {$_.Contains("$IP ")}
    if ($Cmd_Arp_Out -ne $NULL) {
      $HW_Addr=$Cmd_Arp_Out.Substring(24,17)
    }
  }
  $HW_Addr
}

  Функция Get-MAC по IP возвращает MAC сетевой карты удаленной машины.
  Условие "if ($IP -eq $This_IP)" проверяет исследуем мы свой комп или машину в сети. Если IP соответствует твоему собственному компу то выполняется положительное условие и команды из статьи Как узнать MAC адрес своего компа с помощью Powershell.
  Если IP принадлежит удаленной машине, то команда "ping -n 1 -w 2000 IP-адрес" посылается один ICMP-пакет к исследуемому компьютеру. Предварительно протокол ARP находит физ адрес и заносит его и IP удаленного компа в ARP-таблицу. Далее с помощью "arp -a" скрипт находит в таблице нужный нам физ адрес.