После статьи как узнать свой аппаратный адрес средствами 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
}
$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" скрипт находит в таблице нужный нам физ адрес.
Можно использовать:
ОтветитьУдалитьGet-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" -ComputerName [PCName]
Get-WmiObject win32_Networkadapter -Filter "netenabled = 'true'" -ComputerName [PCName]
Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" -ComputerName [IP]
Get-WmiObject win32_Networkadapter -Filter "netenabled = 'true'" -ComputerName [IP]