自宅のネットワークなどで、接続しているPCを全部見つけたいことがある。エクスプローラーのネットワークから見つけることもできるが、スクリプトなどで処理したい場合に手入力するのは面倒だ。そんなときには、PowerShellのGet-NetNeighborコマンドが利用できる。
Get-NetNeighborでアクセス可能なIPアドレスを探す
LAN内のネットワークノードを探すのは面倒な処理だ。たとえば、クラスCのプライベートネットワークならノード数は多くても254個なので、すべてのアドレスに対して、Pingコマンドを実行して応答の有無でノードの存在を確認することも不可能ではない。しかし、実際にスクリプトを書くとなると結構面倒なものになる。なので、PowerShellに組み込まれているネットワーク機能を利用するのが簡単。
Get-NetNeighborは、arpなどを使って得られたIPアドレスの情報を返すコマンドだ。
●Get-NetNeighbor (NetTCPIP)
https://docs.microsoft.com/ja-jp/powershell/module/nettcpip/get-netneighbor?view=windowsserver2019-ps
このコマンドでは、Windowsがネットワークを探索して見つけたアクセス可能なIPアドレスを返す。LANに接続していて電源が入っているPCなら、この中にIPアドレスが含まれているはずだ。ただし、Get-NetNeighborが返すIPアドレスには、PC以外のもの、たとえば、プリンターやルーター、テレビにDVDレコーダーなど、同じLANに接続している「ノード」のほとんどが含まれる。
まずは使い方だが、コマンドを単独で実行すると、すべてのネットワークインターフェースが対象になってしまう。Windows 10では、WSL2のような仮想マシンも動作しているため、多数のネットワークインターフェースが接続しているはずだ。
コントロールパネルの「ネットワークとインターネット」→「アダプター設定の変更」で表示される「ネットワーク接続」を見ると、多数のネットワーク(アダプター)が存在する場合がある。Get-NetNeighborはすべてのネットワークアダプターの情報を返すので、まずは、ANに接続しているアダプターを特定する必要がある。このとき、インターフェースのインデックス番号または名前を指定しなければならない。
ネットワークインターフェースの一覧は、Get-NetAdapterで得ることができる。
このコマンドが出力するオブジェクトの“ifIndex”プロパティがGet-NetNeighborの“-InterfaceIndex”で指定する番号に、“Name”が“-InterfaceAlias”で指定するインターフェース名になる。仮想ネットワークインターフェースを排除して、かつ動作しているインターフェースだけを表示させるには、
Get-NetAdapter -Physical | Where-Object {$_.Status -eq "UP" } | select-object Name,ifIndex
とする。これで、イーサネットや無線LANのインターフェースが表示されるはずだ。どっちを使うのかは、どちらでLANを使っているのかに依存するので各自で判断してほしい。
インターフェース番号(ここでは4とした)が確定したら、Get-NetNeighborを以下のように起動する。なお、ここでは、IPアドレスをIPv4のものに限定した。IPv6のアドレスもあるはずだが、話がややこしくなるので、ここでは、IPv4に限定して話をすすめる。
Get-NetNeighbor -InterfaceIndex 4 -AddressFamily IPv4 -State Stale,Reachable
これで、LAN内のIPv4アドレスが列挙されるはずだ。ただし、IPv4アドレスの中には特殊なIPアドレスがあり、これは除外する必要がある。「224.0.0.0~239.255.255.255」の範囲はマルチキャストアドレスなので無視する。同様に255.255.255.255は、ネットワークブロードキャストアドレス(ローカルブロードキャスト)なので、PCなどに割り当てられることはない。これらは、Stateプロパティが“Permanent”なので区別がしやすい。また、Stateが“Unreachable”は、現在では到達できないことが確定しているため無視して構わない。
このため、“-State”オプションには、“Stale,Reachable”の2つを指定する。“Reachable”は、「到達可能」を意味し、直近のarpに応答があり、存在が確認されたもの。Staleは、それから15~45秒(ランダムに選択される)経過すると、Stale状態に変わる。
なお、注意が必要な点がある。イーサネットと無線LANの両方が接続状態になっているPCは2つのIPアドレスが含まれる点だ。エクスプローラーなどでは、同一のマシンかどうかを判別しているが、Get-NetNeighborはあくまでも個別のIPアドレスとして列挙する点だ。
もうひとつは、PCがスリープ状態に入るなどして一定時間ARPに応答しないとリストから消えてしまう点だ。このため、IPアドレスの探索は、少なくとも対象のPCが起動している状態でしなければならない。
この連載の記事
-
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる - この連載の一覧へ