最終更新日付: 2019年6月12日
Windows Active Directory環境において、
- ドメインコントローラー(兼DNS)が新しく追加された。
- ドメインコントローラのリプレース時にIPアドレスを変えたい。
と言った時に、ADに参加しているクライアント端末のDNS設定を変更したいケースがあります。
そのための情報を紹介します。
レジュメ
前提条件・環境
例えば、
- Windows Server 2008 Active Directoryで
- ADクライアント端末はWindows 7
といった環境で説明します
結論、GPO(ログオンスクリプト・UAC無効)とnetshコマンドでAD参加パソコンのDNS設定変更可能
ただし、条件があります。
ADクライアント端末で使用している一般ドメインユーザーが、そのパソコン(クライアント端末)のローカルadministratorsグループに所属している事が条件になります。
もしも、所属してい無い場合は、DNSの設定変更は困難です。
どのようにADクライアント端末のDNS設定を変更するかと言うと
- GPOでUACを無効にする(既にADクライアント端末のUACが無効ならば不要作業)
- GPOでログオンスクリプトを有効にする
- ログオンスクリプトをnetshコマンドで作成する
- 最後に、GPOを適用する。
※ 「コンピュータの構成」にあるスタートアップスクリプトを利用することにより、UACやローカルadministrators権限が無くても実行できました。(検証済)
アクセス権については以下のリンクを参照。
Windowsのログオンスクリプトの実行権限(実行ユーザー)は?スタートアップスクリプトの場合は?GPO
以上で、ADクライアント端末のDNS設定を変更できます。
1、GPOでUACを無効にする。
netshコマンドでDNSを変更する為には、Windows 7のUAC(ユーザーアクセス制御)を無効にしてあげる必要があります。
GPOの「コンピュータの構成」-「ポリシー」-「Windowsの設定」-「セキュリティの設定」-「ローカルポリシー」-「セキュリティオプション」から
「ユーザーアカウント制御:管理者承認モードですべての管理者を実行する」を無効にします。
これが出来ていないと、いくらローカルのadministrators権限でも以下のエラーでDNS設定を変更できません。
※ この場合は「ログオン」スクリプトではなく「スタートアップ」スクリプトで実施すると良い。
「要求された操作には、権限の昇格が必要です。管理者として実行してください」
これがUCAです。(コマンドプロンプトを起動する時に右クリックして「管理者として実行」しなければならない)
2、GPOでログオンスクリプトを有効にする
GPOで「ユーザーの構成」-「ポリシー」-「Windowsの設定」-「スクリプト(ログオン/ログオフ)」から
「ログオン」をクリックし、スクリプトのパスを追加します。
上の画面の「ファイルの表示」ボタンを押すと、ログオンスクリプトの通常配置場所のフォルダが開きます。
以下のようなパスになります
3、ログオンスクリプトをnetshコマンドで作成する
例えば、上記のようなログオンスクリプトを用意する。
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:\temprem # バッチファイルのログファイル
set LOG=%OUTDIR%\%COMPUTERNAME%.logrem #------------------
rem # 処理開始
rem #------------------dir %OUTDIR%\%COMPUTERNAME%__* >>%LOG% 2>&1
if %ERRORLEVEL%==0 exit /Bcall :OUTPUT before
for /F "usebackq" %%i IN (`
`) do call :SETIF %%i
netsh interface ip show interface ^| findstr "connected"
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>&1call :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=%1goto :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設定変更から除外するようなスクリプトの作りにしてあります。
あまりやらないので、大変参考になりました。
しかしバッチがうまく動作しなかったので、以下の様に単純な物で流しました。
参考まで
バッチは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
>芦原さん
文字化けしてしまいましたか・・・
でも、修正してもらい、うまく動いたようでよかったです。
コピペできるようなhtmlコードにしてあり、
当方では、文字化けしないんですが、不思議ですね、、、