ネットワーク上の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アドレスを調べることが可能だ。
この連載の記事
-
第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つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に - この連載の一覧へ