【AD DS】スクリプト ポリシーの動作の仕組みについて

  • 2022年12月30日
  • 2023年1月5日
  • AD DS

Active Directory ドメイン サービスでは、管理機能の一つとして、ユーザーやコンピューター、アプリケーションにおけるシステム設定を一元的に管理・配布する仕組みが用意されています。これは「グループ ポリシー」と呼ばれる機能で実現しています。グループ ポリシーの概要については、以下の記事で紹介しております。

関連記事

Active Directory ドメイン サービスとは、システム管理者が組織内のユーザーやリソースを管理するためのサービスです。 Active Directory の管理機能の一つとして、ユーザーやコンピューター、アプリケーションにおける[…]

グループ ポリシーでは、ドメイン内の端末で用意したスクリプトを自動で実行させることができます。これはスクリプト ポリシーの仕組みで実現できます。

今回は、スクリプト ポリシーの設定方法や仕組みについて紹介します。

 

スクリプト ポリシーとは?

グループ ポリシーにはスクリプト ポリシーという設定項目があり、ドメイン端末上でスクリプト ファイルを自動で実行させることができます。スクリプト ポリシーでは、コンピューターの起動時、ユーザーのログオン時などの特定のタイミングにおいて、指定したスクリプトが実行されます。

  • スタートアップ スクリプト
    コンピューターの起動時に、SYSTEM アカウントの権限でスクリプトを実行

  • シャットダウン スクリプト
    コンピューターのシャットダウン時に、SYSTEM アカウントの権限でスクリプトを実行

  • ログオン スクリプト
    ユーザーのログオン時に、ログオン ユーザーの権限でスクリプトを実行

  • ログオフ スクリプト
    ユーザーのログオフ時に、ログオン ユーザーの権限でスクリプトを実行

※ログオン スクリプトは、ログオン ユーザーがローカルの管理者権限をもっていた場合、UAC(ユーザー アカウント制御)を回避した状態で実行されます。そのため、スクリプトにシステム変更を加えるような処理が入っていた場合、管理者権限でそのまま処理が続行されます。

 

スクリプト ポリシーの設定方法

スタートアップ/シャットダウン スクリプトはコンピューター ポリシーで、ログオン/ログオフ スクリプトはユーザー ポリシーにて設定することができます。各ポリシーの設定のパスは以下の通りです。

 

■スタートアップ スクリプト
[コンピューターの構成] – [ポリシー] – [Windows の設定] – [スクリプト (スタートアップ/シャットダウン)] – [スタートアップ]

■シャットダウン スクリプト
[コンピューターの構成] – [ポリシー] – [Windows の設定] – [スクリプト (スタートアップ/シャットダウン)] – [シャットダウン]

■ログオン スクリプト
[ユーザーの構成] – [ポリシー] – [Windows の設定] – [スクリプト(ログオン/ログオフ)] – [ログオン]

■ログオフ スクリプト
[ユーザーの構成] – [ポリシー] – [Windows の設定] – [スクリプト(ログオン/ログオフ)] – [ログオフ]

 
 
 

 

各スクリプト ポリシーに、実行する対象のスクリプトのファイルのパスと、実行時のパラメーター(省略可能)を指定します。スクリプトがバッチ ファイル(bat や cmd)の場合は [スクリプト] タブに設定し、PowerShell スクリプトの場合は [PowerShell スクリプト] タブに設定します。

 

スクリプト ポリシーで指定するスクリプト ファイルは、ドメイン コントローラーの SYSVOL の以下のパスに構成することができます。各スクリプト ポリシーのパスは以下の通りです。

■スタートアップ スクリプト
\\<ドメイン名>\sysvol\<ドメイン名>\Policies\{GPO GUID}\MACHINE\Scripts\Startup

■シャットダウン スクリプト
\\<ドメイン名>\sysvol\<ドメイン名>\Policies\{GPO GUID}\MACHINE\Scripts\Shutdown

■ログオン スクリプト
\\<ドメイン名>\sysvol\<ドメイン名>\Policies\{GPO GUID}\USER\Scripts\Logon

■ログオフ スクリプト
\\<ドメイン名>\sysvol\<ドメイン名>\Policies\{GPO GUID}\USER\Scripts\Logoff

上記の既定の SYSVOL のスクリプトのパス以外の、別のファイル サーバー上のファイル共有にスクリプトを配置してスクリプト ポリシーを設定することもできます。その場合は、[スクリプト名] の設定にてスクリプト ファイルのフルパス(\\sv01.test01.local\scripts\logon.bat など)を指定してださい。

 

スクリプト ポリシーの適用の仕組み

グループ ポリシーの適用を総括するのは Group Policy Client (gpsvc) というコンポーネントが担っています。gpsvc はグループ ポリシーの実体の取得を行い、各ポリシーの適用処理は CSE(Client Side Extension)が実行する形となります。

スクリプト ポリシーについては、以下の適用と実行の2段階に分けて処理が実行されます。

  1. スクリプト ポリシーの反映
  2. スクリプトの実行

①のスクリプト ポリシーの反映は、GPO からスクリプト ポリシーの設定を取得して、レジストリに設定値を反映させるっ処理です。レジストリの設定の反映は、スクリプト ポリシーの CSE である gpscript.dll が処理します。適用の結果、スクリプト ポリシーの設定が格納されるレジストリは以下の通りです。

■スタートアップ/シャットダウン ポリシー
HKLM¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Group Policy¥Scripts
HKLM¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Group Policy¥State¥Machine¥Scripts

■ログオン/ログオフ ポリシー
HKCU¥Software¥Microsoft¥Windows¥CurrentVersion¥Group Policy¥Scripts
HKLM¥Software¥Microsoft¥Windows¥CurrentVersion¥Group Policy¥State¥<ユーザー SID>¥Scripts

レジストリに設定が反映されたら、②のスクリプトの実行が行われます。レジストリの設定内容をもとにスクリプトが実行され、実行の処理は gpscript.exe が行います。

ログオン/ログオフ スクリプトの設定は、HKEY_LOCAL_MACHINE にも格納されます。これらのキーが存在しないと、スクリプトは正しく実行されません。

 

フォアグラウンド処理/バックグラウンド処理

スクリプト ポリシーを設定すると、Windows OS の動作に影響を与える可能性があるため、環境や構成に合わせて設定を最適化させるためのポリシーが用意されています。各種ポリシーでの動作を理解するために、事前知識として、まずはグループ ポリシーの適用処理の仕組みを紹介します。

グループ ポリシーの適用の処理は、大きく分けて以下の2通りの処理があります。

  • フォアグラウンド処理 (foreground process)
  • バックグラウンド処理(background process)

フォアグラウンド処理とは、(1)コンピューターの起動時、(2)ユーザーのログオン時のタイミングで行われるグループ ポリシーの適用処理となります。

一方、バックグラウンド処理は、定期的なグループ ポリシーの自動更新のタイミングで行われるグループ ポリシーの適用処理となります。定期的なグループ ポリシーの適用間隔は、ドメイン コントローラーであれば 5 分ごと、メンバ サーバーであれば 90 ~ 120 分ごとが既定値となります。バックグラウンド処理は、ユーザーの操作がトリガーとなることなく、バックグラウンドで自動で実行されている処理となります。

一部のポリシーについては、フォアグラウンド処理でのみ適用されます。

  • スタートアップ スクリプト/ログオン スクリプト
  • フォルダー リダイレクト
  • ソフトウェア インストール
  • ディスク クォーター

 

同期モード/非同期モード

フォアグラウンド処理には、さらに以下の2つのモードが存在します。

  • 同期モード (Synchronous mode)
  • 非同期モード (Asynchronous mode)

フォアグラウンド処理での同期モード/非同期モードというのは、グループ ポリシーの処理とデスクトップ画面の表示処理が同期か非同期かという違いとなります。

同期モードというのは、お互いの処理の完了を待つモードになります。そのため、同期モードの場合は、グループ ポリシーの適用処理が完了するまで、デスクトップは表示されません。一方、非同期モードの場合は、お互いの処理の完了を待たないモードであるため、グループ ポリシーの適用処理が完了していなくても、デスクトップは表示されます。

同期モードでフォアグラウンドのグループ ポリシーの適用処理が行われている場合、グループ ポリシーの適用に時間がかかると、ユーザーがデスクトップを使い始められるまで待たされてしまう状況になります。

フォアグラウンド処理が同期モードか非同期モードかは、OS によって既定動作が異なります。

  • クライアント OS:既定でフォアグラウンド処理は非同期モード
  • サーバー OS:既定でフォアグラウンド処理は同期モード

 

また、一部のポリシーについては、機能の性質上、デスクトップ表示前に処理を完了させておく必要があるため、同期フォアグラウンド処理で適用される動作となります。以下のポリシーは、適用が完了されるまで、デスクトップ画面は表示されません。

  • フォルダー リダイレクト
  • ソフトウェア インストール
  • 基本設定のドライブマップ
  • 基本設定のディスク クォーター

 

複数のスクリプトの実行処理

各スクリプト ポリシーに、複数のスクリプトを構成させることができます。スクリプト ポリシーに複数のスクリプトを設定した場合、スクリプトの実行処理の仕組みも理解した上で構成してください。

同期的/非同期的なスクリプトの実行

各スクリプト ポリシーで複数のスクリプトを構成した場合、既定では以下の通りに動作します。

  • スタートアップ/ログオン
    非同期的にスクリプトを実行

  • シャットダウン/ログオフ
    同期的にスクリプトを実行

これは各スクリプトの実行処理が、同期か非同期かという違いになります。

同期的にスクリプトを実行というのは、1つずつスクリプトが実行され、前のスクリプトの実行終了を待ってから、次のスクリプトが実行される動作になります。一方、非同期的にスクリプトを実行というのは、並列に処理が行われ、前のスクリプトの実行終了を待たずに実行される動作になります。

シャットダウンとログオフ スクリプトは、同期的にスクリプトを実行されるという実装になっており、この動作を変更する方法はありません同期的なスクリプトの実行の場合、処理に時間がかかるスクリプトを複数設定すると、スクリプトの実行完了までに時間がかかり、シャットダウンやログオフの処理が完了しないという問題が発生する可能性があります。そのため、シャットダウンとログオフ スクリプトの設定には配慮してください。

スタートアップとログオン スクリプトは、非同期にスクリプトを実行されるという動作になっております。スタートアップ スクリプトについては、以下のポリシーを設定して、同期的に実行させるように設定することが可能です。

パス:[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [スクリプト]
ポリシー:[スタートアップ スクリプトを非同期に実行する]
設定値:無効

 

スクリプトの実行順序

スクリプト ポリシーに複数のスクリプトが設定されている場合、各スクリプトはプロパティ画面で登録された順序で実行されます。

 

スクリプト ポリシーのプロパティ設定では、登録した順番で表示されます。

右図のプロパティ設定の例の場合、logon1.bat ⇒logon2.bat⇒logon3.bat の順でスクリプトが実行される動作となります。

実行されるスクリプトの順番を変更したい場合は、スクリプトの並び順を変更すれば可能です。

 
 
 
Active Directory ドメインでは、各階層に複数の GPO をリンクすることができるため、各アカウントには複数の GPO が適用されることがあります。適用される各 GPO でスクリプト ポリシーが設定されていた場合、スクリプトの実行順序は、優先順位は低い順にスクリプトが実行されます。
また、ユーザーがシステム シャットダウンを行った場合、ログオフ スクリプトとシャットダウン スクリプトが実行されますが、実行順序は、ログオフ スクリプト⇒シャットダウン スクリプトとなります。

 

スクリプト ポリシーの動作に関するポリシー項目

スクリプト ポリシーを設定していると、ネットワーク上からスクリプトを取得して、スクリプトを実行させるという動作が行われます。フォアグラウンド処理の同期モードでグループ ポリシーが適用される場合、OS を起動してからログオン画面が表示されるまで、またユーザーがログオンしてからデスクトップ画面が表示されるまでに時間がかかる問題が発生することがあります。

もし、スタートアップ スクリプトやログオン スクリプトを設定している環境で、ログオン画面やデスクトップ画面の表示に時間がかかる問題が発生している場合、以下のポリシー設定を見直すことで問題が改善するかご確認ください。

高速ログオンの設定

ユーザーのログオン処理において、グループ ポリシーの適用が完了することを待たずに、デスクトップを表示させる設定のポリシーです。ドメイン コントローラーとのネットワーク接続の確立までに時間がかかって、グループ ポリシーが適用できない状況であったとしても、デスクトップの表示までに時間がかかることはありません。クライアント OS では、既定で高速ログオンは有効になっています。

高速ログオンの設定は以下のポリシーで設定できます。

パス:[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [ログオン]
ポリシー:[コンピューターの起動およびログオンで常にネットワークを待つ]
設定値:有効   (高速ログオンは無効)
              無効 (高速ログオンは有効)
このポリシーを有効にすると高速ログオンは無効化され、コンピューターの起動時とログオン時において、グループ ポリシーの適用処理は「同期モード」で行われます。そのため、グループ ポリシーの適用処理が完了するまで、ログオン画面もしくはデスクトップ画面が表示されないという動作になります。
 

スタートアップ ポリシーの待機時間

OS 起動時にグループ ポリシーを適用する際に、ネットワークが確立されるように待機時間を設定するポリシーです。OS 起動時はネットワークの初期化が行われますが、グループ ポリシーの適用処理も並行して行われます。ネットワークが確立する前に、ポリシーの適用処理が行われてしまうと、ポリシーが適用されない可能性があります。

スタートアップ ポリシーの適用開始までの待機時間は、以下のポリシーで設定できます。

ポリシー:[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [グループ ポリシー]
パス:[スタートアップ ポリシー処理時の待機時間を指定する]
このポリシーの設定で注意が必要なのは、適用対象の端末が OS 起動時に同期モードで動作する場合です。サーバー OS や高速ログオンを無効化している場合、フォアグラウンド処理は同期モードとなるので、グループ ポリシーの適用処理の完了を待ってから、ログオン画面を表示する動作となります。
[スタートアップ ポリシー処理時の待機時間を指定する] にて、90 秒を設定すると、毎回 OS を起動してから 90 秒待ってからポリシーを適用する動作になります。そのため、グループ ポリシーの適用が完了するのは、少なくとも OS を起動してから 90 秒以上はかかるので、それまでログオン画面が表示されないという状況になります。
 

スクリプトの最大待機時間

各スクリプト ポリシーで設定されているスクリプトの実行の完了を、システムが待つ時間を設定するポリシーです。

スクリプト ポリシーで設定されている各スクリプトが実行を終了するまでの合計時間を制限します。ここで指定した時間が経過してもスクリプトの実行が終了しない場合は、システムによってスクリプトの処理が中止されます。スクリプトの最大待機時間は、既定で 10 分となります。

このポリシーは、全てのスクリプト ポリシー(シャットダウン、スタートアップ、ログオン、ログオフ)に適用されます。

パス:[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [スクリプト]
ポリシー:[グループ ポリシー スクリプトの最大待機時間を指定する]

スクリプト ポリシーで設定した、一部のポリシーが適用さていない場合、スクリプトの実行に時間がかかっている可能性もあるので、最大待機時間を延長することで解消する可能性もあります。

このポリシーの設定で注意が必要なのは、最大待機時間を延長することで、スクリプトの実行の処理が続くためシステム負荷がかかる可能性がある点です。また、スタートアップ スクリプトとログオン スクリプトにおいて、同期モードで処理されている場合、スクリプトの実行に時間がかかる状況だと、ログオン画面やデスクトップ画面が表示されるまで時間がかかります。

 

ログオン スクリプトの遅延

ログオン時のグループ ポリシーの処理において、ログオン スクリプトを実行する前に待機する時間を指定できるポリシーです。gpsvc は、ログオンの遅延で指定された時間を待って、スクリプトのを実行させます。

ログオン後した後にログオン スクリプトの実行が開始されるまでの時間を遅らせることで、ディスク競合が防止されて、操作の応答性が高くなるように構成できます。

ログオン スクリプトの実行の遅延は、以下のポリシーで設定できます。

ポリシー:[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [グループ ポリシー]
パス:[ログオン スクリプトの遅延を構成する]
Windows Server 2012 R2/Windows 8.1 以降より、利用可能なポリシーです。既定値は 5 分です。ただし、Windows 10 TH1 以降より、既定値は無効に変更されました。

 

ログオンスクリプトを同期的に実行する

ユーザーがデスクトップを利用できる前に、ログオン スクリプトで設定されている全てのポリシーを適用するように設定するポリシーです。

ユーザーがログオンした後、ログオン スクリプトの実行が完了するまで、デスクトップ画面は表示されません。ユーザーがデスクトップを利用できるまでに、実行完了させておきたいログオン スクリプトがある場合に有効な構成となります。既定は、無効となっています。

ログオン スクリプトの実行完了を待つ構成は、以下のポリシーで設定できます。

パス:[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [スクリプト]
ポリシー:[ログオン スクリプトを同期的に実行する]
設定値:有効
このポリシーを有効にすると、ログオン時のグループ ポリシーの適用処理は「同期モード」で行われるようになります。もし、高速ログオンを有効になっている設定でも、このポリシーが有効の場合は、ログオン時に関しては、「同期モード」でグループ ポリシーの適用処理が行われます。また、このポリシーを有効にすると、[ログオン スクリプトの遅延を構成する] のポリシーは無効化されます。
環境によっては、このポリシーを有効にすることにより、ユーザーがログオンしてからデスクトップが表示されるまで時間がかかるようになる可能性があります。
 
 

ネットワーク接続状態との関連性

ドメイン環境によっては、ネットワークの接続時にコンピューター認証もしくはユーザー認証が必要となるネットワーク構成で運用されているケースもあるかと思います。

その場合、OS の起動時やユーザーのログオン時に、ネットワークの初期化が完了できていないこともあります。ネットワークが確立できていないと、ドメイン コントローラーやファイル サーバーにアクセスできないため、GPO で適用したスタートアップ スクリプトやログオン スクリプトが取得できずに、クライアント端末に反映されないことが想定されます。

スタートアップ スクリプトとログオン スクリプトは、フォアグラウンド処理時にしか適用されないため、OS 起動時やログオン時にネットワークが確立が必須となります。

ただし、ネットワークの構成上、OS 起動時やログオン時までに確実にネットワークが確立できるように構成することが難しいケースも考えられます。その場合の代替策として、GPO で各端末にスクリプト ファイルを配布し、各端末はローカルに保存されているスクリプト ファイルを実行するように、構成することもできます。

このように構成することで、OS 起動時やログオン時のネットワーク接続状況に関わらず、スタートアップ スクリプトやログオン スクリプトを確実に実行させることができます。

スクリプト ファイルの配布は [基本設定] の [ファイル] で行い、配布先とするローカル パスをスクリプト ポリシーで指定することで構成できます。

 

PowerShell スクリプトの場合、ローカルに配置しても、ネットワークが確立されていないと、スクリプトが実行されない動作となります。ローカルに配置する代替策を実施する場合は、コマンドベースのバッチファイルをご用意ください。