ActiveDirectoryでログオンスクリプトを設定しているのに、なぜか実行されないことがある。これにはいろいろな原因が考えられるが、私の経験上以下のような原因があると推測される。
推測される原因
ログオンスクリプトの遅延実行
下記リンクの記事にもある通り、Windows10ではログオンスクリプトが遅延して実行される。まずはこの設定を確認する。
以下、リンク先本文より引用。
この動作は、ログオン スクリプトの動作を制御する新しいグループ ポリシー設定 (ログオン スクリプト遅延の構成) がWindows 8.1に含まれているために発生します。 このスクリプトは、次の場所に格納されます。
コンピューター構成\管理用テンプレート\System\グループ ポリシー
[ログオン スクリプト遅延の構成] ポリシーの既定値の設定は [未構成] です。 ただし、グループ ポリシー クライアントの既定の動作は、ログオン スクリプトを実行するまで 5 分待機することです。
5 分間の遅延の目標は、Windows 8.1 ベースのコンピューターでのユーザーのデスクトップの読み込みを高速化することです。
デスクトップの読み込みを高速にするために遅延実行しているとのこと。
グループポリシーの未適用
グループポリシー適用のタイミングによっては、最新のグループポリシーが適用されていないことがある。グループポリシーを手動で適用させるには、gpupdateコマンドを使う。
gpupdateの詳細については下記リンクの記事が詳しい。
以下、リンク先本文より引用。
Active Directory環境では、システム各部に関する設定を「グループポリシー」の機能を使って制御している。このグループポリシーは、クライアントPCが起動するときや、ユーザーがシステムにサインインするときなどにロード、適用されるようになっている。またバックグラウンドでも、ある一定時間ごとに更新されている。
だがシステムやネットワークの設定状態や、何らかのトラブルや設定ミスなどにより、グループポリシーが正しくクライアントに伝達されない場合がある。
グループポリシーを強制的に適用するには、コマンドプロンプトで以下のように実行する。
gpupdate /force
私の経験では、このコマンドでログオンスクリプトが実行されるようになることが多かった。
低速回線
低速回線に接続していると判断されるとGPOがうまく適用されないことがある。
以下、リンク先本文より引用。
Active Directoryでは,クライアントの起動時にGPO配布元のドメイン・コントローラ(DC)に対してICMPパケットを送出し,その平均応答時間を計測して,接続している回線を判断しています。ICMPのパケットはpingコマンドで送出されるパケットと基本的に同一で,マシン間の到達性を確認する際などに用いられます。
クライアントの起動時にICMPパケット、いわゆるpingを飛ばして低速回線かどうか判断している模様。
代替案の提案
例えば特定のユーザーのログイン時にスクリプトを実行したい場合、ユーザーのスタートアップフォルダにスクリプトを配布するという方法がある。
グループポリシーを使ったファイルの配布方法については、以下の記事を参考。
例えば、test.batを実行したい場合以下のようにターゲットファイルを記述する。
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\test.bat
スタートアップフォルダにあるファイルはログイン時に実行される。ログオンスクリプトと全く同じではないが、これで似たようなことはできる。
おわりに
ログオンスクリプトが実行されない原因はいくつも考えられるので苦労する。代替案は「こんなやり方もあるのか」といった感じ見ていただければ。