このページの本文へ

前へ 1 2 次へ

Windows Info 第289回

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

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

文● 塩田紳二 編集● ASCII

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

ネットワーク上のPCの名前を知りたい

 Get-NetNeighborで得られたIPアドレスには、以下のものが含まれている。

PCのネットワークインターフェースに割り当てられたIPアドレス
プリンター
NAS
スマートフォン
ルーター
テレビやDVDレコーダーなど

 このうち、Windowsネットワークから見えるPCやプリンター、NASなどについては、Windowsで「名前解決」が可能になっており、多くの場合、IPアドレスから名前(コンピュータ名)を探すことができる。それには、Resolve-DnsNameコマンドを使う。

●Resolve-DnsName (DnsClient)
 https://docs.microsoft.com/en-us/powershell/module/dnsclient/resolve-dnsname?view=windowsserver2019-ps

 これは基本的には、ドメイン名サーバー(DNSサーバー)を使って、名前からIPアドレスを得るものだが、LLMNR(Link-Local Multicast Name Resolution)やNETBIOSを使って名前解決をすることができる。LLMNRはMicrosoftがIPv6などでも利用可能なローカルでの名前解決として提案したプロトコルだ。RFCとして公開されているプロトコルだが、Windows以外ではプリンターやNASが実装している程度だ。

 具体的には、以下のようにGet-Netneighborの出力に対してforeach-objectで受けてresolve-DnsNameを実行する。本来Resolve-DnsNameはコンピュータ名を指定するが、IPアドレスを指定すると、IPアドレスからの名前解決(IPアドレスを逆順にして.in-addr.arpaをつける)をしてくれる。

Resolve-DnsNameを使うと、PCやプリンターなどはIPアドレスから名前を見つけることが可能になる

Get-NetNeighbor -InterfaceIndex 4 -AddressFamily IPv4 -State Stale,Reachable | ForEach-Object { Resolve-DnsName $_.IPAddress -ErrorAction SilentlyContinue -QuickTimeout }

 少なくともResolve-DnsNameを使えば、WindowsマシンはIPアドレスから名前を検索できる。ただし、すべてのネットワークノードがLLMNRを実装しているわけではないので、LLMNRに応答しないものもある。

 このためLLMNRによる問い合わせでは、タイムアウト処理をして、一定時間内に応答がないものはエラーにする。前記コマンドの「-ErrorAction SilentlyContinue」は、そのエラーを無視して次に処理を進めるためのもの。「-QuickTimeout」はタイムアウト時間を短く設定するものだ。実際、筆者宅のネットワークでは、Get-NetNeighborの実行が0.2秒程度なのに対して、Resolve-DnsNameをその後にすると100秒程度かかってしまう。

 SMBv1が廃止になって、スクリプトなどから、ネットワーク内のPCを列挙するのが面倒になったが、Get-NetNeighborとResolve-DnsNameを使えば、コンピュータ名や稼働中のネットワークノードのIPアドレスを調べることが可能だ。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

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

ピックアップ

ASCII.jp RSS2.0 配信中

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