Active Directoryで自動的にスクリプトを実行する嵌りポイント
Windows ServerのActive Directoryに於けるログオン・ログオフ・スタートアップ・シャットダウンのそれぞれのスクリプトを設定しなければならないシーンに於ける嵌りポイントをちょっとまとめてみました。自分がまんまと嵌って、実行されないのなんでだろうとなった部分についての備忘録です。
特に権限周りや適用対象を間違えていたりで無駄に時間を消費することがないように・・・
目次
スクリプトの配置場所
概要
BATファイルやPowershell、VBSなど様々なスクリプトを利用して、マシンの起動時や終了時に実行するスクリプトなのですが、このスクリプトの配置場所はどこでも良いというわけじゃありません。ADのサーバ上に配置はするのですが、これは他のクライアントマシンからネットワーク超しに見える必要性があるため、例えば共有もしていないようなADのデスクトップにスクリプトを配置して指定しても実行されません。
各組織部門毎に用意される
ADサーバの「グループポリシーの管理」にて、AD上の各組織部門にリンクされたグループポリシーを編集するわけなのですが、その際にスクリプトを指定するダイアログに於いて、「ファイルの表示」で出てくるディレクトリはネットワークアドレスに基づいたURLとなっています(例:\\hogehoge.com\test\policie\みたいな)。ここの嵌りポイントは
- 各OU事且つスクリプトのタイプによって用意されてるフォルダが異なる
- 追加をクリックした際に出てくるのはその用意されてるフォルダとなる
- ネットワークアドレスでのアクセスでは「読み取り専用」となってるのでそのままだとファイルを入れられない
- このフォルダはクライアントからは直接的に見えるので、実行する事が可能
実際にこのフォルダにスクリプトを配置したい場合のローカルのパスは
「C:\Windows\SYSVOL\domain\Policies\{ここにランダムな数値}\Machine\Scripts\Shutdown」となっているので、「ファイルの表示」で出てきたランダム数値以下の部分をコピーして、「C:\Windows\SYSVOL\domain\Policies\」繋げた場所が配置出来るパスになります。
図:シャットダウンスクリプトのダイアログ
各種スクリプトについて
グループポリシー管理にて、各OUのポリシーを編集するわけなのですが、意味も分からず触ってると、動いたり動かなかったり。またポリシーエディタで正しい設定をしていても、AD側できちんと対象のOUに対してオブジェクトを配置していないと、そもそもポリシー自体が適用されなかったり。
また、GPOは組織部門(OU)に対してリンクは出来ますが、コンテナに対してはリンクする事が出来ません。必ず組織部門等を作ってからそこに紐付けが必要になります。
図:計4つの特色のあるスクリプト
ログオン・ログオフスクリプト
ドメインに対してログオンやログオフする際に実行されるスクリプト。実行権限はユーザ権限になります。但し、ユーザが管理者権限を持っていたとしても、管理者権限を要求する(つまり、UACに引っかかる)ようなスクリプトや、フォルダへの書き込みが必要な場合にこのスクリプトで実行しても実行が失敗します。
また、このスクリプトについては別のグループポリシーに於いて遅延実行が出来たり、同期的に実行するといったポリシーを配布する事で、ログオンしたらいきなり実行ではなく5分後に実行させたり、ログオンスクリプトが完了するまでデスクトップの表示を待ったりといったことが可能です。ネットワークに接続されるまで待機するようなポリシーもあるので、ネットワークドライブがマウントされる必要のあるスクリプトの場合は、合わせ技で適用する必要があります。
またこのポリシーは「ユーザの構成」にあるので、指定のOUに所属してるユーザアカウントに対して有効化されます(GPOをリンクしないままであったり、無効化してたりした場合は動きません)。
※但しログオンスクリプトの遅延実行や非同期実行のポリシーはユーザの構成ではなくコンピュータの構成の中にあるので、指定OUに対して人ではなくコンピュータオブジェクトを所属させないと適用されません。
図:ログオンスクリプトの遅延実行ポリシー
スタートアップスクリプト
スタートアップスクリプトは「コンピュータの構成」の中にあるポリシーで、指定のOUに所属してるコンピュータに対して有効化されます。故に指定OUにコンピュータオブジェクト(通常はPCのコンピュータ名で自動登録されてるハズ)をきちんとそのOUに移動させてあげないと適用されません。人に対してではないので要注意。
ログオンスクリプトと似てるようで非なるのは、
- 遅延実行する事ができません。またそのようなポリシー設定もありません
- 実行権限がSYSTEMなので、管理者権限を要求するようなEXEの実行や、フォルダへの書き込み、レジストリへの書き込みについてUACに引っかかることなく実行が可能です
- スタートアップすると即時実行なので、マウントに時間の掛かるPC版Google Driveのディレクトリなどに対してはマウントする前にアクセスされてしまう可能性があります。
となっています。よってMSI形式ではないEXE形式のアプリのサイレントインストールであったり、条件判定させてレジストリの値を変更するなどADのレジストリポリシーでは難しいことをやらせることが可能です。ただしNASもマウントされる前に実行されてしまう可能性があるので、通常はサイレントインストールに関しては後述のシャットダウンスクリプトを利用します。
シャットダウンスクリプト
MSI形式のインストーラの場合、ADでサイレントインストール配布をすることが可能です。しかし、EXE形式の場合はそのような事が出来ません。サイレントインストールする仕組みを備えていたとしてもです。そんな際に利用するのがシャットダウンスクリプト。こちらも「コンピュータの構成」の中にあるポリシーであるため、指定のOUに所属してるコンピュータに対して有効化されます。故に指定OUにコンピュータオブジェクト(通常はPCのコンピュータ名で自動登録されてるハズ)をきちんとそのOUに移動させてあげないと適用されません。人に対してではないので要注意。
ログオフスクリプトと似て非なる点は
- 遅延実行する事ができません。またそのようなポリシー設定もありません
- 実行権限がSYSTEMなので、管理者権限を要求するようなEXEの実行や、フォルダへの書き込み、レジストリへの書き込みについてUACに引っかかることなく実行が可能です
- 高速スタートアップが有効な場合、シャットダウンが為されずハイバネーション(休止状態)となるため、実行されない
BATファイルで管理者権限を使っての自動実行が出来る点はスタートアップスクリプトと同じですが、シャットダウンの場合はNASやGoogle Driveでもマウントされてるハズの状態で使えるので、一般的にEXEのサイレントインストールで利用されます。
但し、上記にあるように電源プランの高速スタートアップが有効な場合には、シャットダウンを実行してもそれはシャットダウンではなく休止状態になるだけなので、当然シャットダウンスクリプトが実行されません。よって、後述のスタートアップスクリプトを併用して、特定ファイルの有無を元に高速スタートアップをオフにするようにして使い、そしてアプリがインストールされたら、高速スタートアップをオンに戻すという仕組みにしています。
図:高速スタートアップの設定場所
図:高速スタートアップのレジストリの場所
高速スタートアップオンオフスクリプト
スタートアップスクリプトおよびシャットダウンスクリプトは、クライアントマシンが「高速スタートアップが有効」な場合、発動しません。シャットダウンを実行してもそれはハイバネーションが実行されてるだけでシャットダウンとは異なる為です。自分の場合はシャットダウンスクリプトで必要な「高速スタートアップのオフ」について、アプリがインストール済みかどうかを自動判定してオンオフする為に利用しています(管理者権限を要求するレジストリを読み書きさせる)。以下のようなBATファイルを利用しています。
このスクリプトをスタートアップスクリプトに仕込むことで判定が実行されてオンオフが反映されます。システム権限が必要なので、ログオンスクリプトでは実行できませんので要注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@echo off rem 確認するファイル set text=C:\Program Files\hogehoge\tomato.exe rem ファイルが存在していたらインストール済みと判断 if exist "%text%" ( echo "高速スタートアップオン" reg add "HKLM\SYSTEM\ControlSet001\Control\Session Manager\Power" /f /v "HiberbootEnabled" /t REG_DWORD /d 1 exit /b ) else ( echo "高速スタートアップオフ" reg add "HKLM\SYSTEM\ControlSet001\Control\Session Manager\Power" /f /v "HiberbootEnabled" /t REG_DWORD /d 0 exit /b ) |
ポリシー適用と実行確認
きちんと指定のOUに人やコンピュータオブジェクトを移動させておけば、子OUに対して適用したポリシーは、ドメインにログオン時に適用されます。また、適切なコードと権限を考慮したスクリプトであるならば、それぞれの実行タイミングできちんと実行してくれます(シャットダウンスクリプトだけは注意が必要ですが)。
しかしVPNで在宅ワークといった場合で、VPN回線側からADが見えない人の場合は、そのポリシーは適用されないこともあります。ADが見えているのであれば
1 |
gpupdate /force |
とコマンドを打てば、手動でポリシーを拾ってきて適用するようになります。また、現在適用済みのグループポリシーおよび前述でセットしたスクリプトの実行結果については
1 |
gpresult /v |
とコマンドを打てば、確認することが出来、スクリプトについては最終実行がいつであったのかを確認することが可能です(実行されていない場合は、このスクリプトはまだ実行されていませんと出ます)。
図:スクリプトの実行結果確認
図:ポリシー適用状況確認