Webやメールサーバーを管理している場合、適切に設定されたDNSレコードに大いに依存していることを知っているでしょう。DNSレコードが欠落していると、ウェブサイトを見つけることができない、メールが配信されないなどのさまざまな問題が発生する可能性があります。PowerShellのResolve-DnsNameコマンドレットが存在するおかげで、DNSレコードの監視をスクリプト化して自動化することができます。
管理者の日常業務はすでに十分に忙しいため、DNSレコードが適切に解決できるかどうかを手動で確認することは、より多くの手作業を意味します。
本記事では、PowerShellを使用してDNSレコードをクエリするためのResolve-DnsNameコマンドレットの使用方法について学びます。記事の最後まで進めば、監視するための指定したDNSレコードのレポートを作成するための基本的なスクリプトの作成方法も学ぶことができます。
前提条件
本記事は手順を追いながら進める予定であるため、以下が必要です:
- A computer running Windows 10 or above.
- Windows PowerShell 5.1またはPowerShell 7.0
- A script editor such as Visual Studio Code, Atom, or Notepad++.
Resolve-DnsName:PowerShell DNSリゾルバー
DNSクエリを実行する方法は1つ以上あります。Resolve-DnsNameコマンドレットは、Windowsに付属しているnslookupコマンドラインツールや、Linux管理者の場合はdigコマンドに似ています。
一部のウェブサイトでは、DNSレコードの監視やレポート作成のサービスを提供しています。しかし、これらの第三者サービスはほとんどが有料です。もちろん、無料の代替手段もあります。さらに、スクリプトのスキルを披露することもできます。
その名前が示すように、Resolve-DnsName
コマンドレットはDNS名をIPアドレスに解決したり、その逆を行うためのものです。このコマンドレットは、Windows 10、Windows Server 2012/R2、Windows Server 2016、Windows Server 2019といったバージョンのWindowsと一緒に提供されるdnsclientPowerShellモジュールの一部です。
Resolve-DnsName
はPowerShellのコマンドレットなので、結果はオブジェクトとして返され、保存や操作、エクスポートが可能です。たとえば、Resolve-DnsName google.com
というコマンドでgoogle.comのDNSレコードを検索すると、以下の出力が得られます。

この結果はオブジェクトとして返され、結果をCSVファイルにエクスポートしたり、HTMLレポートの形式に変更したりすることができます。
Resolve-DnsName
コマンドレットは、古いnslookup
ユーティリティとは異なります。nslookup
は単純な文字列を返します。以下のスクリーンショットで例を見ることができます。この情報を解析する必要がある場合、苦労することになります。

さまざまなタイプのDNSレコードのクエリ
デフォルトでは、Resolve-DnsName
はAおよびAAAADNSレコードのタイプをクエリします。たとえば、以下のコマンドを使用してgmail.com
のDNSレコードを検索すると:
以下のように、AAAAレコードとAレコードのみが返されます。これは、検索するDNSレコードのタイプが指定されていないためです。

では、私たち全員がgmail.comがGoogleのメールサービスで使用されるメールドメインであることを知っているので、それに関連するMXレコードがあるはずですよね?これを確認するために、次のコマンドを使用できます:
以下のスクリーンショットに示されている出力は、gmail.comのMXレコードリストを示しています。

Resolve-DnsName
で使用できるさまざまなレコードタイプについて詳しく知るには、このリンクを参照し、-Type
パラメータのテーブルを探してください。または、get-help Resolve-DnsName
コマンドを使用してResolve-DnsNameのヘルプを参照できます。
DNSルックアップのために特定のサーバーを使用する
Resolve-DnsName
はデフォルトでコンピュータに設定されたDNSサーバーアドレスを使用します。しかし、Resolve-DnsName
を特定のDNSサーバーを使用してルックアップするように設定することもできます。
例えば、Google Public DNSを使用してレコードをルックアップしたい場合、以下の例のようにコマンドに-Server
パラメータを追加することで実現できます。
上記のコマンドの結果は、以下のスクリーンショットに示すものと似ています。

この時点で、「なぜ異なるDNSサーバーを使用する必要があるのか?」と思われるかもしれません。それは有効な質問です。同じレコードをデフォルトのDNSサーバーまたは他のDNSサーバーを使用してルックアップしようとすると、おそらく同じ結果が得られるかもしれません。
Resolve-DnsName
で異なるDNSサーバーを使用する理由はさまざまです。これらの理由には、次のようなものがあります:
- 速度 – 一部のDNSサーバーは他のサーバーよりも高速です。
- セキュリティ – 一部のDNSサーバーは、ハイジャックや攻撃を防ぐためのより多くのセキュリティ対策があります。
- レコードの可用性 – ほとんどの場合、組織は独自の内部DNSサーバーを持っており、内部でのみ解決される名前のゾーンとレコードが含まれています。この場合、パブリックDNSサーバーを使用して内部名を検索すると失敗します。

- DNSサーバーはリクエストを転送していません – 一部の組織ではDNS転送を許可していません。パブリックDNSレコードのDNSルックアップに使用すると失敗します。
- トラブルシューティングとテスト – 好きなDNSサーバーが正常に動作していない場合、別のDNSサーバーを使用してルックアップをテストしたい場合があります。
PowerShellスクリプトを使用したDNSレコードの報告
これで、Resolve-DnsName
コマンドレットの基本的な使用方法を学んだので、このセクションでは、DNSレコードを監視およびレポートするためのPowerShellスクリプトを作成する方法を学びます。これまでに学んだ知識を適用して、このスクリプトの構築に取り組むことができるはずです。
好きなスクリプトエディタを起動し、GetDnsRecord.ps1という新しいファイルを作成します。
変数の定義
まず、使用する変数を決定します。これらの変数には次のものが含まれます:
$NameList
– この変数には、スクリプトがクエリするDNSレコードの名前を保持します。$Serverlist
– この変数を使用して、スクリプトがルックアップに使用するDNSサーバーを指定します。
以下のコードをコピーしてスクリプトの先頭に貼り付けます。
DNSルックアップの実行
次に、コードは指定された名前のDNSレコードを検索できる必要があります。この場合、foreachループを使用してレコードのリストを反復処理し、Resolve-DnsName
を使用して各名前を検索します。
行$FinalResult = @()
は、最終結果が格納される空の配列を作成します。その後、foreachループを使用して、PowerShellは$NameList
変数内の各アイテムを$Name
という変数に渡します。
各反復で、行$tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage
は、成功したDNSルックアップの結果を保持するために、四つのプロパティを持つ一時オブジェクトを作成します。
次に、try{}
ステートメントを使用して、Resolve-DnsName
コマンドを実行し、DNS Aレコードを検索し、$tempObj
の値を埋めます。もしDNSルックアップが失敗した場合、catch{}
ステートメントがエラーをキャッチし、エラーは$tempObj
オブジェクトに含まれます。
各反復の終わりには、$tempObj
オブジェクトの値が$FinalResult
に追加されます。そして、$NameList
配列の最後のアイテムが処理されると、ループは終了します。その後、$FinalResult
の値が表示されます。
以下のコードをコピーしてスクリプトの最後に貼り付けます。値を変更する必要はありません。
スクリプトを保存した後、PowerShellでその名前を呼び出すことで実行します。GetDnsRecord.ps1。以下のデモンストレーションは出力を示しています。

上記の結果からわかるように、出力はオブジェクトです。これは、以下のコマンドを使用してCSVファイルに結果をエクスポートする場合に便利です。
CSV出力は次のようになります。

結論
この記事では、PowerShellでDSNレコードの検索を行うためにResolve-DnsName
コマンドレットの基本を学びました。また、Resolve-DnsName
がnslookupユーティリティなどの他のツールと異なる方法も学びました。
Resolve-DnsName
をスクリプトで使用してDNSレコードの検索を自動化する方法を見てきました。これは、監視ツールとして役立ち、管理対象のDNSレコードの現在の状態を把握するのに役立ちます。
PowerShellのスクリプト作成スキルを活用して、レポートスクリプトにコードを追加して、指定された受信者にレポートを自動的に送信するメール送信を行うこともできます。また、ビジュアルに魅力的なHTML出力を作成するためにも変更することができます。
最後に、Resolve-DnsName
は手動で使用するか、スクリプトの自動化に使用するかに関係なく、DNS検索に優れたツールです。今ではその動作方法について知識を持っており、管理タスクの一部として使用する方法を見つけることができます。