ネットワーク上の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をつける)をしてくれる。
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アドレスを調べることが可能だ。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ












