ネットワーク上の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アドレスを調べることが可能だ。
この連載の記事
-
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? -
第418回
PC
Windows 11のスマートフォン連携は新機能が追加されるなど、いまだ進化している - この連載の一覧へ