Resolve-DnsName:PowerShellでDNSレコード検索をマスターする

Webやメールサーバーを管理している場合、適切に設定されたDNSレコードに大いに依存していることを知っているでしょう。DNSレコードが欠落していると、ウェブサイトを見つけることができない、メールが配信されないなどのさまざまな問題が発生する可能性があります。PowerShellのResolve-DnsNameコマンドレットが存在するおかげで、DNSレコードの監視をスクリプト化して自動化することができます。

管理者の日常業務はすでに十分に忙しいため、DNSレコードが適切に解決できるかどうかを手動で確認することは、より多くの手作業を意味します。

本記事では、PowerShellを使用してDNSレコードをクエリするためのResolve-DnsNameコマンドレットの使用方法について学びます。記事の最後まで進めば、監視するための指定したDNSレコードのレポートを作成するための基本的なスクリプトの作成方法も学ぶことができます。

前提条件

本記事は手順を追いながら進める予定であるため、以下が必要です:

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レコードを検索すると、以下の出力が得られます。

DNS Record lookup result using Resolve-DnsName

この結果はオブジェクトとして返され、結果をCSVファイルにエクスポートしたり、HTMLレポートの形式に変更したりすることができます。

Resolve-DnsNameコマンドレットは、古いnslookupユーティリティとは異なります。nslookupは単純な文字列を返します。以下のスクリーンショットで例を見ることができます。この情報を解析する必要がある場合、苦労することになります。

DNS record lookup result using nslookup

さまざまなタイプのDNSレコードのクエリ

デフォルトでは、Resolve-DnsNameはAおよびAAAADNSレコードのタイプをクエリします。たとえば、以下のコマンドを使用してgmail.comのDNSレコードを検索すると:

Resolve-DnsName -Name gmail.com

以下のように、AAAAレコードとAレコードのみが返されます。これは、検索するDNSレコードのタイプが指定されていないためです。

DNS record for gmail.com

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

Resolve-DnsName -Name gmail.com -Type MX

以下のスクリーンショットに示されている出力は、gmail.comのMXレコードリストを示しています。

MX Record list of gmail.com

Resolve-DnsNameで使用できるさまざまなレコードタイプについて詳しく知るには、このリンクを参照し、-Typeパラメータのテーブルを探してください。または、get-help Resolve-DnsNameコマンドを使用してResolve-DnsNameのヘルプを参照できます。

DNSルックアップのために特定のサーバーを使用する

Resolve-DnsNameはデフォルトでコンピュータに設定されたDNSサーバーアドレスを使用します。しかし、Resolve-DnsNameを特定のDNSサーバーを使用してルックアップするように設定することもできます。

例えば、Google Public DNSを使用してレコードをルックアップしたい場合、以下の例のようにコマンドに-Serverパラメータを追加することで実現できます。

# Google Public DNSのサーバーIP
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

上記のコマンドの結果は、以下のスクリーンショットに示すものと似ています。

DNS record lookup results using a specific DNS servers

この時点で、「なぜ異なるDNSサーバーを使用する必要があるのか?」と思われるかもしれません。それは有効な質問です。同じレコードをデフォルトのDNSサーバーまたは他のDNSサーバーを使用してルックアップしようとすると、おそらく同じ結果が得られるかもしれません。

Resolve-DnsNameで異なるDNSサーバーを使用する理由はさまざまです。これらの理由には、次のようなものがあります:

  • 速度 – 一部のDNSサーバーは他のサーバーよりも高速です。
  • セキュリティ – 一部のDNSサーバーは、ハイジャックや攻撃を防ぐためのより多くのセキュリティ対策があります。
  • レコードの可用性 – ほとんどの場合、組織は独自の内部DNSサーバーを持っており、内部でのみ解決される名前のゾーンとレコードが含まれています。この場合、パブリックDNSサーバーを使用して内部名を検索すると失敗します。
DNS record lookup failure
  • DNSサーバーはリクエストを転送していません – 一部の組織ではDNS転送を許可していません。パブリックDNSレコードのDNSルックアップに使用すると失敗します。
  • トラブルシューティングとテスト – 好きなDNSサーバーが正常に動作していない場合、別のDNSサーバーを使用してルックアップをテストしたい場合があります。

PowerShellスクリプトを使用したDNSレコードの報告

これで、Resolve-DnsNameコマンドレットの基本的な使用方法を学んだので、このセクションでは、DNSレコードを監視およびレポートするためのPowerShellスクリプトを作成する方法を学びます。これまでに学んだ知識を適用して、このスクリプトの構築に取り組むことができるはずです。

好きなスクリプトエディタを起動し、GetDnsRecord.ps1という新しいファイルを作成します。

変数の定義

まず、使用する変数を決定します。これらの変数には次のものが含まれます:

  • $NameList – この変数には、スクリプトがクエリするDNSレコードの名前を保持します。
  • $Serverlist – この変数を使用して、スクリプトがルックアップに使用するDNSサーバーを指定します。

以下のコードをコピーしてスクリプトの先頭に貼り付けます。

$NameList = @('adamtheautomator.com','powershell.org','xyz.local')
$ServerList = @('8.8.8.8','8.8.4.4')

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の値が表示されます。

以下のコードをコピーしてスクリプトの最後に貼り付けます。値を変更する必要はありません。

$FinalResult = @()
foreach ($Name in $NameList) {
    $tempObj = "" | Select-Object Name, IPAddress, Status, ErrorMessage
    try {
        $dnsRecord = Resolve-DnsName $Name -Server $ServerList -ErrorAction Stop | Where-Object { $_.Type -eq 'A' }
        $tempObj.Name = $Name
        $tempObj.IPAddress = ($dnsRecord.IPAddress -join ',')
        $tempObj.Status = 'OK'
        $tempObj.ErrorMessage = ''
    }
    catch {
        $tempObj.Name = $Name
        $tempObj.IPAddress = ''
        $tempObj.Status = 'NOT_OK'
        $tempObj.ErrorMessage = $_.Exception.Message
    }
    $FinalResult += $tempObj
}
return $FinalResult

スクリプトを保存した後、PowerShellでその名前を呼び出すことで実行します。GetDnsRecord.ps1。以下のデモンストレーションは出力を示しています。

Script to lookup multiple DNS records using Resolve-DnsName

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

.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformation

CSV出力は次のようになります。

DNS record lookup report exported to a CSV file

結論

この記事では、PowerShellでDSNレコードの検索を行うためにResolve-DnsNameコマンドレットの基本を学びました。また、Resolve-DnsNameがnslookupユーティリティなどの他のツールと異なる方法も学びました。

Resolve-DnsNameをスクリプトで使用してDNSレコードの検索を自動化する方法を見てきました。これは、監視ツールとして役立ち、管理対象のDNSレコードの現在の状態を把握するのに役立ちます。

PowerShellのスクリプト作成スキルを活用して、レポートスクリプトにコードを追加して、指定された受信者にレポートを自動的に送信するメール送信を行うこともできます。また、ビジュアルに魅力的なHTML出力を作成するためにも変更することができます。

最後に、Resolve-DnsNameは手動で使用するか、スクリプトの自動化に使用するかに関係なく、DNS検索に優れたツールです。今ではその動作方法について知識を持っており、管理タスクの一部として使用する方法を見つけることができます。

さらなる読み物

Source:
https://adamtheautomator.com/resolve-dnsname/