ドメインコントローラーを再起動するとネットワークの場所がドメインではなくプライベートとなってしまう事象の対策

テクニカルDNS,Network Location Awareness,NLA,Windows Server 2019

ドメコン1台の環境で、Windows Server 2016位までは特に問題なかったのですが、2019になって顕著に出るようになったこの問題。

複数台あれば問題ないのですが、単体だと再起動の度にネットワークの場所が変わってしまって困っていたのの解消方法がわかったのでメモ。

再起動するとネットワークの場所が変わってしまう

これドメインコントローラーなのですが、ネットワークの場所が「ドメイン ネットワーク」ではなく「プライベート ネットワーク」となってしまっています。

再起動すると毎回起きてしまっていて、ファイアウォールなどで不都合が起きるために何とかしたいと思ってました。

ファイアウォールの問題

そもそもファイアウォールで何故問題が起きるかというと、Windowsのファイアウォールってネットワークの場所でルールを付けられるんですよね。それに伴ってドメインネットワークでは許可していてもその他では拒否にしてると、繋がらない!みたいな問題が発生するということ。

DNS Serverより先にNetwork Location Awarenessが先に起動するのが問題

何故こんな現象が起きるかというと、ネットワークの場所を確認するサービス「Network Location Awareness」が、ドメインの名前解決をする「DNS Server」よりも先に立ち上がってしまうことが原因です。

そのため、OS起動後にサービス(service.msc)からNlaSvcの再起動を行えば、再度チェックが行われてネットワークの場所がドメインに変更されます。

他にもNICを無効にして有効にするって手段もありますが、本番環境では中々出来ないと思います。

なおドメインコントローラーが複数台ある場合は、OS起動時に他のドメインコントローラーに名前解決に行くのでこの問題は発生しません。

NLAをDNSサービスより後に立ち上げたい

前項で説明した通り、要するにDNSが立ち上がってからNLA(Network Location Awareness)が立ち上がれば不具合は発生しません。それでいくつか試してみました。

NLAの起動を自動(遅延起動)に設定→失敗

最初に試したのは、単純にNLAを遅延起動にしてみること。これで治るかなと思って再起動しましたが、変わらずで断念。

タスクスケジューラーでサービス再起動→失敗?

適当な上記のようなバッチファイルを作成し、タスクスケジューラーに組み込みました。

ちなみに1行目はNLAの停止(依存サービスのNetwork List Serviceも停止)、2行目でNLSの起動、3行目でNLAの起動を行っています。

そしてシステム起動時に立ち上がるようにして再起動……動きませんね。何故かわからないのですが、上手く立ち上がりませんでした。

ならってことで、DNS Serverの起動ログをトリガーにしてみたのですが、こちらも上手く動作せずに結局プライベートで立ち上がってきてしまいました。

とはいえ、こんなタスクスケジューラーにバッチ埋め込むとか綺麗じゃないのであんまりしたくはありません。

NLAの依存サービスにDNSを追加→成功

最後に試してみたのは、NLAの依存サービスにDNSを追加してみるということ。先のバッチファイルのやつは、DNSが起動した後に自動的にNLAを再起動しようとしましたが、今回はそもそもDNSが立ち上がるまで待たせるという方法です。

まずは以下のレジストリに移動します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc

中に複数行文字列として「DependOnService」があることをまず確認してください。確認できたらNlaSvcのキーをエクスポートしてやらかしても復元できるようにしておきます。

DependOnServiceとは

このDependOnServiceという項目ですが、これはここに書いてあるサービスが立ち上がるまで、該当のサービス(今回であればNlaSvc)の立ち上げを待機するという項目です。

デフォルトでも項目が入っているので、意図して消してなければ図と同じ項目が有ると思います(2019の場合)

ではこのDependOnServiceに、DNS Serverのサービスを追加します。記載する際には表示名ではなくサービス名である「DNS」を記載します。

こんな感じです。こうすることで意味合いとしては「DNS Serverが立ち上がったらNLAを起動する」という動きになります。

そして再起動したら、無事に起動時の段階でドメイン ネットワークになりました。しかし2012や2016でもこのDependOnServiceにはDNSは無かったのですが、何か処理が変わったんですかね。

ってことで、単体のドメインコントローラーを立てる時に同様の事象が起きたら参考にしてみてください。