このページの本文へ

前へ 1 2 次へ

Windows Info 第289回

WindowsのコマンドでLAN内のデバイスを探す

2021年08月22日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 自宅のネットワークなどで、接続しているPCを全部見つけたいことがある。エクスプローラーのネットワークから見つけることもできるが、スクリプトなどで処理したい場合に手入力するのは面倒だ。そんなときには、PowerShellのGet-NetNeighborコマンドが利用できる。

PowerShellのGet-NetNeighborコマンドは、ネットワーク内の通信により得たIPアドレスを出力できる。ただし、大量の出力があるので、不要なものを排除する必要がある

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で得ることができる。

Get-NetAdapterで物理的なネットワークインターフェースで起動しているもの(UP)を選べば、イーサネットや無線LANのネットワークインターフェースが見つかる

 このコマンドが出力するオブジェクトの“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に限定して話をすすめる。

インターフェース番号やIPアドレスの条件などを指定することで、Get-NetNeighborコマンドでネットワーク内の有効な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が起動している状態でしなければならない。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン