PowershellでMicrosoft DNS Serverの管理をする

Microsoft DNS Server　は、Windows Serverに搭載されているDNSサーバです。
Active DIrectoryはDNSが必須なので、Active Directory環境では一般的にはMicrosoft DNS Serverが使用されているかもしれません。
DNSサーバの管理タスクとしては、レコードの追加や変更など、結構頻繁に発生します。頻繁には発生しないという人は、この記事を見る必要はありません。
Microsoft DNS　Serverの管理にはGUIの管理ツールを使用すると思います。しかしリモートから管理しようとすると、リモートデスクトップでログインしてGUI管理ツールを使用する必要があります。頻繁に管理タスクが発生する場合には、その都度リモートデスクトップというのは煩わしい作業になるかもしれません。Windowsパソコンから管理するのであれば、リモート管理ツールがあるので、リモートデスクトップしなくても管理ができますが、クライアントがMacだったりすると、他の方法はありません。強いていうとWindows Admin Toolを使用するという方法がありますが、この方法については別途記事を書こうと思います。
ということで、 DNS ServerにSSHでアクセスしてPowershellからDNSサーバを操作する方法を説明します。
[1. 前提条件](#1前提条件)
[2. PowershellとDNS管理する場合の基本](#2PowershellとDNS管理する場合の基本)
[3. ゾーンのレコードの確認](#3-ゾーンのレコードの確認)
[4. レコードの追加](#4-レコードの追加)
[5. レコードの削除](#5-レコードの削除)
# 1.前提条件
初めに前提条件を説明します。
(1) Windows Serverはどのバージョンでも問題ないと思いますが私はWindows Server 2022を使用しました。
(2) Powershellのバージョンは、これもバージョンごとには違わないと思いますが7.4.2を使用しました。
(3) SSHDはWindows Server に標準のOpenSSHを使用していますが、WindowsのOpenSSHの標準のシェルはCMD.exeです。それをPowershellに変更していますがその方法はここでは述べません。cmd.exeの中でpowershellを起動しても構いません。
(4) cmd.exeではdnscmdというDNSサーバ管理のCLIがありますが、今後廃止されるかもしれないということなので、Powershellで管理する方法を説明します。
# 2.PowershellとDNS管理する場合の基本
まずはDNS管理のコマンドについてGUIと違いまずコマンド名を知らないとどうしようもありません。
PowershellでDNSに関わらずコマンドを探すには以下のようにします。
```powershell
# get-command *dns*                

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           dnsn -> Disconnect-PSSession
Alias           Export-DnsServerTrustAnchor                        2.0.0.0    DNSserver
Alias           Get-DnsServerRRL                                   2.0.0.0    DNSserver
Alias           Set-DnsServerRRL                                   2.0.0.0    DNSserver
Function        Add-DnsClientDohServerAddress                      1.0.0.0    DnsClient
Function        Add-DnsClientNrptRule                              1.0.0.0    DnsClient
Function        Add-DnsServerClientSubnet                          2.0.0.0    DNSserver
Function        Add-DnsServerConditionalForwarderZone              2.0.0.0    DNSserver
Function        Add-DnsServerDirectoryPartition                    2.0.0.0    DNSserver
(以下略）
```
`get-command`は覚えて下さい。
`*dns*` はコマンド名にdnsを含むコマンドという意味です。
結果がいっぱい出てきます。一番右側の`Source`の欄を見ると、`DNSserver`とか`DncClient`とか出てきます。
今回は、DNS Serverの管理なので　DNSserverに絞ります。
```powershell:
# get-command -Module DNSserver

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Export-DnsServerTrustAnchor                        2.0.0.0    DNSserver
Alias           Get-DnsServerRRL                                   2.0.0.0    DNSserver
Alias           Set-DnsServerRRL                                   2.0.0.0    DNSserver
Function        Add-DnsServerClientSubnet                          2.0.0.0    DNSserver
Function        Add-DnsServerConditionalForwarderZone              2.0.0.0    DNSserver
Function        Add-DnsServerDirectoryPartition                    2.0.0.0    DNSserver
(以下略）
```
それでもまだいっぱい出てきますが、これが、DNS Serverの管理コマンドの全てです。
コマンドは、原則`get`や`add`、`remove`、`set`などのアクションに-で対象を指定する形式になっています。
さらにRemoveに絞ります。
```powershell
# get-command -Module DNSserver remove*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Remove-DnsServerClientSubnet                       2.0.0.0    DNSserver
Function        Remove-DnsServerDirectoryPartition                 2.0.0.0    DNSserver
Function        Remove-DnsServerForwarder                          2.0.0.0    DNSserver
Function        Remove-DnsServerQueryResolutionPolicy              2.0.0.0    DNSserver
Function        Remove-DnsServerRecursionScope                     2.0.0.0    DNSserver
Function        Remove-DnsServerResourceRecord                     2.0.0.0    DNSserver
Function        Remove-DnsServerResponseRateLimitingExceptionlist  2.0.0.0    DNSserver
Function        Remove-DnsServerRootHint                           2.0.0.0    DNSserver
Function        Remove-DnsServerSigningKey                         2.0.0.0    DNSserver
Function        Remove-DnsServerTrustAnchor                        2.0.0.0    DNSserver
Function        Remove-DnsServerVirtualizationInstance             2.0.0.0    DNSserver
Function        Remove-DnsServerZone                               2.0.0.0    DNSserver
Function        Remove-DnsServerZoneDelegation                     2.0.0.0    DNSserver
Function        Remove-DnsServerZoneScope                          2.0.0.0    DNSserver
Function        Remove-DnsServerZoneTransferPolicy                 2.0.0.0    DNSserver
#
```
個々のコマンドの詳細は、
```powershell
# get-help Add-DnsServerVirtualizationInstance

NAME
    Add-DnsServerVirtualizationInstance

SYNTAX
    Add-DnsServerVirtualizationInstance [-Name] <string> [-ComputerName <string>] [-FriendlyName <string>] [-Description <string>] [-PassThru] [-CimSession <CimSession[]>] [-ThrottleLimit <int>] [-AsJob] [-WhatIf] [-Confirm] [<CommonParameters>]      


ALIASES
    None


REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
        -- To download and install Help files for the module that includes this cmdlet, use Update-Help.
```
もしくは`コマンド -?` で確認します。

それでは実際に管理をしてみましょう。
# 3. ゾーンのレコードの確認
```powershell
 Get-DnsServerResourceRecord example.com | sort RecordType,HostName
```
`example.com`にはドメインを指定します。
`-rrtype A` のようにリソースレコードタイプを指定して、表示することも可能です。
尚、`sort RecordType,HostName` はRecordTypeで並び替えをして、同じレコードタイプの中では、Hostnameで並び替えをします。`sort RecordType＋HostName`　とすると、RecordTypeとHostNameの組み合わせで並び替えをします。並び替えは、昇順になります。降順にする場合は`-Descending`を指定します。

# 4. レコードの追加
example.com に　myname という 192.168.168.168 のAレコードを追加します。
まずは、レコードがないか確認します。
```powershell
# get-DnsServerResourceRecord example.com myname                                
Get-DnsServerResourceRecord: XXX サーバー上の example.com ゾーンにある myname レコードを取得できませんでした。
# 
```
追加します。
```powershell
# add-DnsServerResourceRecord example.com myname -A -ipv4address 192.168.168.168
# 
```
結果を確認します。
```powershell
# get-DnsServerResourceRecord example.com myname                                

HostName                  RecordType Type       Timestamp            TimeToLive      RecordData
--------                  ---------- ----       ---------            ----------      ----------
myname                    A          1          0                    01:00:00        192.168.168.168

```
# 5. レコードの削除
`Remove-DnsServerResourceRecord`を使用します。
```powershell
# Remove-DnsServerResourceRecord example.com myname -RRType "A" -RecordData 192.168.168.168             

Confirm
XXX サーバー上のゾーン example.com からタイプ A の DNS リソース レコード myname が削除されます。続行しますか?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y
#
```