AD参加パソコンのDNS設定を一括で変更する方法。

最終更新日付: 2019年6月12日

Windows Active Directory環境において、

  • ドメインコントローラー(兼DNS)が新しく追加された。
  • ドメインコントローラのリプレース時にIPアドレスを変えたい。

と言った時に、ADに参加しているクライアント端末のDNS設定を変更したいケースがあります。
そのための情報を紹介します。

前提条件・環境

例えば、

  • Windows Server 2008 Active Directoryで
  • ADクライアント端末はWindows 7

といった環境で説明します

結論、GPO(ログオンスクリプト・UAC無効)とnetshコマンドでAD参加パソコンのDNS設定変更可能

image

ただし、条件があります。

ADクライアント端末で使用している一般ドメインユーザーが、そのパソコン(クライアント端末)のローカルadministratorsグループに所属している事が条件になります。
もしも、所属してい無い場合は、DNSの設定変更は困難です。

どのようにADクライアント端末のDNS設定を変更するかと言うと

  1. GPOでUACを無効にする(既にADクライアント端末のUACが無効ならば不要作業)
  2. GPOでログオンスクリプトを有効にする
  3. ログオンスクリプトをnetshコマンドで作成する
  4. 最後に、GPOを適用する。

※ 「コンピュータの構成」にあるスタートアップスクリプトを利用することにより、UACやローカルadministrators権限が無くても実行できました。(検証済)
アクセス権については以下のリンクを参照。

Windowsのログオンスクリプトの実行権限(実行ユーザー)は?スタートアップスクリプトの場合は?GPO

以上で、ADクライアント端末のDNS設定を変更できます。

1、GPOでUACを無効にする。

image

netshコマンドでDNSを変更する為には、Windows 7のUAC(ユーザーアクセス制御)を無効にしてあげる必要があります。
GPOの「コンピュータの構成」-「ポリシー」-「Windowsの設定」-「セキュリティの設定」-「ローカルポリシー」-「セキュリティオプション」から
「ユーザーアカウント制御:管理者承認モードですべての管理者を実行する」を無効にします。

これが出来ていないと、いくらローカルのadministrators権限でも以下のエラーでDNS設定を変更できません。

※ この場合は「ログオン」スクリプトではなく「スタートアップ」スクリプトで実施すると良い。

image

「要求された操作には、権限の昇格が必要です。管理者として実行してください」

これがUCAです。(コマンドプロンプトを起動する時に右クリックして「管理者として実行」しなければならない)

2、GPOでログオンスクリプトを有効にする

image

GPOで「ユーザーの構成」-「ポリシー」-「Windowsの設定」-「スクリプト(ログオン/ログオフ)」から
「ログオン」をクリックし、スクリプトのパスを追加します。

上の画面の「ファイルの表示」ボタンを押すと、ログオンスクリプトの通常配置場所のフォルダが開きます。
以下のようなパスになります

image

3、ログオンスクリプトをnetshコマンドで作成する

image

例えば、上記のようなログオンスクリプトを用意する。
DNS設定を追加しているのは、「netsh」コマンドです。
また、不要になったDNS設定を削除することも、追加するDNS順番を変えることもnetshオプションで可能です。

※ このログオンスクリプトの場合、Windows 7パソコンに対し、「ローカル エリア接続」のネットワークアダプタのみに設定が出来ます。

4、最後に、GPOを適用する。

ドメインユーザー(ログオンスクリプト)とドメインコンピュータ(UAC)にそれぞれGPOを割り当て
作業が完了です。

これでADクライアントのDNS設定を変更出来ます!
一括は危険なので(ログオンスクリプト間違い等)、少しずつOUにGPOを適用しDNS変更をしていきましょう。

PCのDNS設定変更のバッチファイルサンプル

@echo off
rem #------------------
rem # 変数設定
rem #------------------

rem # 設定したいインターフェイスのサブネットを指定する
set SUBNET=192.168.0.

rem # 設定したいDNSサーバを指定する
set DNS1=192.168.1.4
set DNS2=192.168.0.4
set DNS3=

rem # ipconfigファイルの出力先フォルダ指定する
set OUTDIR=C:\temp

rem # バッチファイルのログファイル
set LOG=%OUTDIR%\%COMPUTERNAME%.log

rem #------------------
rem # 処理開始
rem #------------------

dir %OUTDIR%\%COMPUTERNAME%__* >>%LOG% 2>&1
if %ERRORLEVEL%==0 exit /B

call :OUTPUT before

for /F "usebackq" %%i IN (`netsh interface ip show interface ^| findstr "connected"`) do call :SETIF %%i
echo %_IF% >>%LOG%

if not "%DNS1%"=="" netsh interface ipv4 set dns %_IF% static %DNS1% >>%LOG% 2>&1
if not "%DNS2%"=="" netsh interface ipv4 add dns %_IF% %DNS2% >>%LOG% 2>&1
if not "%DNS3%"=="" netsh interface ipv4 add dns %_IF% %DNS3% >>%LOG% 2>&1

call :OUTPUT after

goto :EOF

rem #------------------
rem # 処理終了
rem #------------------

:SETIF

netsh interface ip show ipaddresses %1 | findstr /V /I Dhcp | findstr "%SUBNET%" >nul
if %ERRORLEVEL%==0 set _IF=%1

goto :EOF

:OUTPUT

set _KEY=%1

netsh interface ip show config >> %OUTDIR%\%COMPUTERNAME%_%_KEY%%date:/=%.log
goto :EOF

netshコマンドでDNSを設定変更できますね。
Windows7とWindows10で上記スクリプトの動作確認しました。
今回は、DHCPで設定されたNIC(例えばWiFi)はDNS設定変更から除外するようなスクリプトの作りにしてあります。

AD参加パソコンのDNS設定を一括で変更する方法。」への2件のフィードバック

  1. 芦原

    あまりやらないので、大変参考になりました。
    しかしバッチがうまく動作しなかったので、以下の様に単純な物で流しました。
    参考まで
    バッチはASNI形式で保存 utf8は文字化けしました
    環境はwindows2019+win10

    set IFNAME=”ローカル エリア接続”
    set DNSSERVER1=***.***.***.***
    set DNSSERVER2=***.***.***.***

    netsh interface ipv4 set dns name=%IFNAME% source=static addr=%DNSSERVER1% register=primary validate=no
    netsh interface ipv4 add dns name=%IFNAME% addr=%DNSSERVER2% index=2 validate=no

    返信
    1. プチSE 投稿作成者

      >芦原さん

      文字化けしてしまいましたか・・・
      でも、修正してもらい、うまく動いたようでよかったです。

      コピペできるようなhtmlコードにしてあり、
      当方では、文字化けしないんですが、不思議ですね、、、

      返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です