Windows Server 2016に、ドメイン参加できない(コンピュータが登録されずエラー)

# Windows Server 2016にドメイン参加できない

　ドメイン参加時に参加用に作成したアカウント認証は通るが、コンピュータが登録されずエラー発生。すごく困った。いろいろやって、なんとか解決できた。これはその時の原因究明の記録である。

以下の要点は確認済みである。

1. Windows Serverはプライマリドメインコントローラーである。

    テスト用に急遽立ち上げたサーバーだ。

2. "ドメインにワークステーションを追加"の権限割り当て

    　グループポリシーの管理 > グループポリシーオブジェクト > Default Domain Controllers Policy を右クリックして編集を選択し、以下のパラメータを参照する。
    　コンピューターの構成 > ポリシー > Windowsの設定 > セキュリティの設定 > ローカルポリシー > ユーザー    権利の割り当て > ドメインにワークステーションを追加
    　同パラメータはデフォルトで"Authenticated Users"となっており、認証が通ればドメインにコンピュータが登録されるはずである。
    　これを任意のユーザにすることで、ドメイン参加用アカウントを絞ることもできる。

3. "ms-DS-MachineAccountQuota"、アカウントがコンピュータを追加できる台数の上限

    　ドメインのアカウントにつき、コンピュータを登録できる台数の制限はデフォルトで10台までだが、これはADSIエディターのプロパティを開き、属性エディタ上で、"ms-DS-MachineAccountQuota"の値を変更すれば事実上の制限解除が可能だ（ゼロ台にして意図的に登録不能にすることもできる）。

    ![machine-account-quota - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21725/e5e2867d-cd85-de53-c7d3-a80f757c6098.png)

4. ドメインに参加させたいWindows10 Pro(以下、クライアント)のDNS設定

    　さらにクライアント側の設定を盤石にする。アダプター設定の変更で、優先DNSサーバをWindows Server 2016のIPアドレスに固定。

5. クライアントからの名前解決

    　クライアントからWindows Serverへの通信の疎通確認。コマンドプロンプトで以下のコマンドで調査できる。

```
> nltest /dsgetdc:[ドメイン名] /force
> nslookup [フォレスト名]
```

## さらに調査

　権限的にも問題なし、台数制限もクリア、DNSもWindows Serverに向かせた、疎通も確認できている。ドメイン参加までは一歩手前のはず。
　だが、なぜだがドメイン参加時にエラーが発生する。現象確認のため、以下のログを確認する。testというドメインにPC-001というコンピュータを、test\joinアカウントを使用して参加を試みている。

Windows\debug\NetSetup.LOG

```
08/22/2019 14:13:20:567 NetpDoDomainJoin
08/22/2019 14:13:20:567 NetpDoDomainJoin: using current computer names
08/22/2019 14:13:20:567 NetpDoDomainJoin: NetpGetComputerNameEx(NetBios) returned 0x0
08/22/2019 14:13:20:567 NetpDoDomainJoin: NetpGetComputerNameEx(DnsHostName) returned 0x0
08/22/2019 14:13:20:567 NetpMachineValidToJoin: 'PC-001'
08/22/2019 14:13:20:569 NetpMachineValidToJoin: status: 0x0
08/22/2019 14:13:20:569 NetpJoinDomain
08/22/2019 14:13:20:569 	HostName: PC-001
08/22/2019 14:13:20:569 	NetbiosName: PC-001
08/22/2019 14:13:20:569 	Domain: test
08/22/2019 14:13:20:569 	MachineAccountOU: (NULL)
08/22/2019 14:13:20:569 	Account: test\join
08/22/2019 14:13:20:569 	Options: 0x27
08/22/2019 14:13:20:574 NetpValidateName: checking to see if 'test' is valid as type 3 name
08/22/2019 14:13:20:629 NetpCheckDomainNameIsValid [ Exists ] for 'test' returned 0x0
08/22/2019 14:13:20:629 NetpValidateName: name 'test' is valid for type 3
08/22/2019 14:13:20:629 NetpDsGetDcName: trying to find DC in domain 'test', flags: 0x40001010
08/22/2019 14:13:35:629 NetpDsGetDcName: failed to find a DC having account 'PC-001$': 0x525, last error is 0x0
08/22/2019 14:13:50:628 NetpDsGetDcName: failed to find a DC in the specified domain: 0x54b, last error is 0x0
08/22/2019 14:13:50:628 NetpJoinDomainOnDs: NetpDsGetDcName returned: 0x54b
08/22/2019 14:13:50:628 NetpJoinDomainOnDs: Function exits with status of: 0x54b
08/22/2019 14:13:50:628 NetpJoinDomainOnDs: NetpResetIDNEncoding on '(null)': 0x0
08/22/2019 14:13:50:628 NetpDoDomainJoin: status: 0x54b
```

　ログには以下の文言が確認できる。

```
08/22/2019 14:13:35:629 NetpDsGetDcName: failed to find a DC having account 'PC-001$': 0x525, last error is 0x0
```

　要するにコンピュータがドメインに登録されていないから見つからないということなのだが、ここで解決したいのはドメインに自動的にコンピュータが登録されることだ。まるで本末転倒なログである。

## 忘れていたこと

　一点、忘れていたことがあった。Windows Serverのコンピュータ名の変更をしたのだった。デフォルトで割り当てられたコンピュータ名がランダム英数字で覚えられないのを嫌ってのことだ。変更後のコンピュータ名は、WIN-SERVER。覚えやすい。

　だが、これが直接の原因につながることだった。

## 解決編

　DNSマネージャーでDNS設定を確認する。予想通り、コンピュータ名の変更を受けて、サブドメインが変更されている。
　一箇所、前方参照ゾーンのtest.localに変更前のコンピュータ名の設定が見つかる。これは必要ないと判断して削除。他にも似たような箇所があるか探っていくと。

　あった。

　前方参照ゾーン > test.local > _msdcs

　このデータに旧コンピュータ名で割り当てられていた。IPアドレスは空になっている。

![dns-manager - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21725/7175efc6-d243-551d-b17c-0e24c9ac5567.png)

　これを、WIN-SERVER.test.localに改め、IPアドレスもWindows Serverのものに変更する。
　もしかしてこれか!?という期待をこめて、クライアントからドメイン参加の手順を実施。

![welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21725/77bdd290-4e46-69e6-736e-fc935cab1926.png)

　いや、もー、なんつーか、疲れた。

## 原因

　原因としては、コンピュータ名を変更したことによる、DNSの_msdcs更新不備によるものだと思われる。

　前方参照ゾーン > test.local > _msdcs

　が現在のコンピュータ名と一致していない場合は注意しましょうという話でした。おわり。