リストにドメイン名を書いて、nslookupを自動実行

DNSの切替などで、大量のドメイン名に対してnslookupでDNSレコードを確認することがあった。
手作業でコマンドを実行するにはあまりに大変で、ミスも増える。おまけに記録にも残らないので、Powershellでスクリプトにした。

大量のドメインをリストとしてCSVに記載し、そのCSVをシェルに読み込ませて繰り返しnslookupをさせる。ドメイン名はざっくり2種類に分類した。1つはhttpプロトコルで参照する用のドメイン（ブラウザのURLに書いてあるドメイン名）として、AレコードとCNAMEレコードを確認したいもの。もう1つはメールなどのドメイン（アットマーク以降に記載のもの）で、MXとTXTレコードを確認したいもの。これらのドメインが大量にある場合、スクリプトを使って自動で実行する。

# 動作環境
・Windows 10 Pro　Ver 22H2 OSビルド19045.2604
WindowsServerで実行したら動かなかったりするので、Powershellの動作確認って本当に難しい。Linuxのbashと勝手が違う。

# ソースコード
まずはそのソースコードから。
```powershell:nslookup-list.ps1(文字コードUTF-8 with BOM/改行コードCRLFで保存)
#$Arg1は文字列型,リストを指定
Param([String]$Arg1)

#リストの存在確認
$csvfile = $Arg1
if (-not (Test-Path $csvfile)){
    Write-Output "リストがないため、スクリプト終了"
    exit 11
}

#リストを配列に格納
$array01 = Import-Csv $csvfile -Header type, FQDN
#DNSキャッシュを削除
ipconfig /flushdns
#forによる配列読み込み
foreach ($i in $array01) {
    #時刻取得
    Get-Date -Format F
    #Aレコード、CNAMEレコードの条件分岐
    If($i.type -eq "web"){      
        Write-Output ("nslookup -type=cname "+$i.FQDN)
        nslookup -type=cname $i.FQDN
        Write-Output ("nslookup -type=a "+$i.FQDN)
        nslookup -type=a $i.FQDN
    #MXレコード、TXTレコードの条件分岐
    }elseif($i.type -eq "mail"){
        Write-Output ("nslookup -type=mx "+$i.FQDN)
        nslookup -type=mx $i.FQDN
        Write-Output ("nslookup -type=txt "+$i.FQDN)
        nslookup -type=txt $i.FQDN
    # 例外処理
    }else{
        Write-Output "リスト1列目の指定エラー(web/mail以外)のためスクリプト終了"
        exit 12
    }
}
```
リストCSVの存在確認を行い、存在しなければ11をエラーコードとして返す。
リストCSVを読み込んで、1列目にwebまたはmailの指定がなければ、エラーコード12を返す。
色んなエラーハンドリングを書いてたけど（引数チェックとか、リスト2列目が空の場合とか）、別に無償奉仕だったしそこまでやらんでええわ、と思ったのであきらめた。リファクタリングは適宜実施。

# リスト
スクリプトに読み込ませるリストをCSV形式で作成する。
```csv:list.csv(文字コードUTF-8 with BOM/改行コードCRLFで保存)
mail,yahoo.co.jp
mail,gmail.com
mail,outlook.com
web,www.yahoo.co.jp
web,www.google.com
```
mailと書いている行はメールのドメイン名。MXとTXT（SPF）レコードを返す。
webはwebサイトのドメイン名。AとCNAMEレコードを返す。

# 実行
Powershellを開いてコマンドをたたく。
実行結果のログを残して保存しておきたいので、そういう形で実行する。
ここではC:\Users\localというフォルダにスクリプトとリストを保存している。

## 空ログファイル作成
```powershell:Powershellプロンプト
PS C:\Users\local> $USERDESKTOP=[System.Environment]::GetFolderPath("Desktop")
PS C:\Users\local> $LOGDATE=(Get-Date).ToString("yyyyMMdd-HHmmss")
PS C:\Users\local> New-Item -type file $USERDESKTOP\nslookup-list_$LOGDATE.log
# ↑デスクトップにログファイル（空）を生成している。
```

空のログファイル（nslookup-list_yyyyMMdd-HHmmss.log）をデスクトップ作成した。作成したファイルはスクリプト実行が終わるまで開かないこと。

## nslookupスクリプト実行
この記録する器ができたらスクリプトを実行。

```powershell:Powershellプロンプト
PS C:\Users\local> .\nslookup-list.ps1 .\list.csv > $USERDESKTOP\nslookup-list_$LOGDATE.log
```

デスクトップの空ログファイル（nslookup-list_yyyyMMdd-HHmmss.log）に実行結果が保存される。ログの中身を確認

## ログ確認
```powershell:Powershellプロンプト
PS C:\Users\local> cat $USERDESKTOP\nslookup-list_$LOGDATE.log

Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。
2023年2月17日 13:54:31
nslookup -type=mx yahoo.co.jp
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

yahoo.co.jp     MX preference = 10, mail exchanger = mx5.mail.yahoo.co.jp
yahoo.co.jp     MX preference = 10, mail exchanger = mx3.mail.yahoo.co.jp
yahoo.co.jp     MX preference = 10, mail exchanger = mx2.mail.yahoo.co.jp
yahoo.co.jp     MX preference = 10, mail exchanger = mx1.mail.yahoo.co.jp
nslookup -type=txt yahoo.co.jp
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

yahoo.co.jp     text =

        "google-site-verification=GvbYgNin-mY73VbS4IJK2D8nI3tHEf2NpRdy76VYqBU"
yahoo.co.jp     text =

        "v=spf1 include:spf.yahoo.co.jp ~all"
2023年2月17日 13:54:31
nslookup -type=mx gmail.com
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

gmail.com       MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com       MX preference = 30, mail exchanger = alt3.gmail-smtp-in.l.google.com
gmail.com       MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com
gmail.com       MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com       MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com

gmail-smtp-in.l.google.com      AAAA IPv6 address = 2404:6800:4008:c05::1a
alt1.gmail-smtp-in.l.google.com AAAA IPv6 address = 2607:f8b0:4023:c0b::1b
nslookup -type=txt gmail.com
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

gmail.com       text =

        "v=spf1 redirect=_spf.google.com"
gmail.com       text =

        "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
2023年2月17日 13:54:32
nslookup -type=mx outlook.com
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

outlook.com     MX preference = 5, mail exchanger = outlook-com.olc.protection.outlook.com
nslookup -type=txt outlook.com
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

outlook.com     text =

        "google-site-verification=DC2uC-T8kD33lINhNzfo0bNBrw-vrCXs5BPF5BXY56g"
outlook.com     text =

        "v=spf1 include:spf-a.outlook.com include:spf-b.outlook.com ip4:157.55.9.128/25 include:spf.protection.outlook.com include:spf-a.hotmail.com include:_spf-ssg-b.microsoft.com include:_spf-ssg-c.microsoft.com ~all"
outlook.com     text =

        "google-site-verification=0iLWhIMhXEkeWwWfFU4ursTn-_OvoOjaA0Lr7Pg1sEM"
2023年2月17日 13:54:32
nslookup -type=cname www.yahoo.co.jp
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

www.yahoo.co.jp canonical name = edge12.g.yimg.jp
nslookup -type=a www.yahoo.co.jp
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

名前:    edge12.g.yimg.jp
Address:  183.79.219.252
Aliases:  www.yahoo.co.jp

2023年2月17日 13:54:32
nslookup -type=cname www.google.com
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

google.com
        primary name server = ns1.google.com
        responsible mail addr = dns-admin.google.com
        serial  = 510093512
        refresh = 900 (15 mins)
        retry   = 900 (15 mins)
        expire  = 1800 (30 mins)
        default TTL = 60 (1 min)
nslookup -type=a www.google.com
サーバー:  UnKnown
Address:  2404:1a8:7f01:b::3

名前:    www.google.com
Address:  142.251.42.196

```

以降は
・空ログファイル作成
・nslookupスクリプト実行
を繰り返す。繰り返すことで、複数ログファイルができ、それをdiffることで差分を確認できる。

# 余談
久々にPowershell使ったけど、構文が長くて大変。

マルーン5とか久しく聞いてなかったですが、ボーカルが嫁さんいるのにスキャンダルしたとニュースがあった。でも、この人らの歌っていつもそういう歌（愛する人がいるけれど、他の誰かも好きになって”行動しちゃった”系。ちょっと同じ人間としてどうかしてる、非常に動物的な雰囲気の歌詞）だったじゃないですが・・・。なんの驚きもないっす。「でしょうね」としか思えなかった。
ちなみに私はこの歌（のリズム）が好きです。~~当然歌詞はクズいです。~~
[Makes Me Wonder Closed Captioned - Maroon5](https://music.youtube.com/watch?v=sAebYQgy4n4&feature=share)