サイトアイコン puti se blog

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

Windows Active Directory環境において、

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

前提条件・環境

例えば、

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

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

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

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を無効にする。

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:\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設定変更から除外するようなスクリプトの作りにしてあります。

モバイルバージョンを終了