家庭内や企業のLAN(ローカルエリアネットワーク)で、ネットワークに接続されているデバイスのIPアドレスをWindowsマシンで収集したい場合、PINGコマンドを使った方法が一般的ですが、IPアドレスごとにPINGを打って収集したり、スクリプトを作成して収集するのは意外と面倒です。
そこでここでは、PowerShellのGet-NetNeighborコマンドレットを使って、LANに接続されているデバイスのIPアドレスを収集する方法を紹介します。
目次
Get-NetNeighborコマンドレットの使い方
Get-NetNeighborコマンドレットは、LANを探索してアクセス可能なIPアドレスを一覧表示してくれるPowerShellコマンドレットです。
Get-NetNeighborコマンドレットを実行するときは、まず探索したいLANに接続しているネットワークインターフェースのIDを指定します。(ネットワークインターフェースを指定せずに実行すると、すべてのネットワークインターフェースが対象になります。)
ネットワークインターフェースのIDは、以下のコマンドを実行することで調べることができ、「ifIndex」列に表示されている番号がIDとなります。
PS> Get-NetAdapter | Where-Object {$_.Status -eq "UP" } | Select-Object Name,ifIndex
インターフェースIDを確認したら、Get-NetNeighborコマンドレットを以下のように実行することで、対象のLANに接続しているデバイスのIPv4アドレスが収集され一覧表示されます。
PS> Get-NetNeighbor -InterfaceIndex 16 -AddressFamily IPv4 -State Stale,Reachable
コマンドレットに指定している「-State」オプションは、マルチキャストアドレス(224.0.0.0~239.255.255.255)やブロードキャストアドレス(255.255.255.255)を表示しないようにするためです。
なお、Get-NetNeighborコマンドレットでは、スリープしているデバイスなどは検出できない場合があるので注意が必要です。
Get-NetNeighborコマンドレットのより詳しい使い方を知りたいときは、以下の公式サイトが役立つでしょう。
Get-NetNeighbor (NetTCPIP) | Microsoft Learn
名前解決もしたいときは
Get-NetNeighborコマンドレットで調べたIPアドレスから、Windowsマシンようにコンピューター名が設定されているデバイスの名前解決も行いたい場合は、Resolve-DnsNameコマンドレットを組み合わせることで実現できます。
Resolve-DnsNameコマンドレットは、DNSサーバーやLLMNR(Link-local Multicast Name Resolution)、NBT(NetBIOS over TCP/IP)を使って名前解決(正引き、逆引き)できます。
たとえば、Get-NetNeighborコマンドレットで取得したIPアドレスそれぞれに対して名前解決を行いたいときは、以下のように実行します。
PS> Get-NetNeighbor -InterfaceIndex 16 -AddressFamily IPv4 -State Stale,Reachable | ForEach-Object { Resolve-DnsName $_.IPAddress -ErrorAction SilentlyContinue -QuickTimeout }
すると、名前解決ができたデバイスが一覧表示され「NameHost」列にコンピューター名が表示されます。
Resolve-DnsNameコマンドレットで指定できるオプションなどについては、以下の公式サイトが役立つでしょう。
Resolve-DnsName (DnsClient) | Microsoft Learn
あとがき
LAN上のデバイスのIPアドレスを調べたい場合、専用ツールを使ったり、PINGコマンドを駆使する方法もありますが、個人的には上で紹介したPowerShellを使った方法が最も効率よく調べることができる方法だと思います。
ご活用あれ。