グループポリシーでPowerShellスクリプトを実行する方法 — Real Talk
PowerShell スクリプトをグループポリシー (GPO) 経由で実行するのは、スクリプトをフォルダーにドロップしてうまくいくことを期待するほど簡単ではありません。特に最近の Windows バージョンを使っている場合は、設定や動作の癖が問題になることがあります。以前試してみたものの、スクリプトが実行されなかったり、一部のマシンでは実行できても他のマシンでは実行できなかったりするかもしれません。このガイドでは、起動時やユーザーログオン時など、スクリプトを確実に動作させる方法と、その過程で発生するいくつかの落とし穴について解説します。Windows は、当然のことながら、必要以上に複雑な仕組みになっているからです。
最終的に、マシンの起動時、ユーザーのログイン時、さらにはシャットダウン時など、さまざまなフェーズでPowerShellスクリプトをスムーズに実行するセットアップが完成します。何がすごいって? 最新のWindowsはGPOエディタからスクリプトを直接実行できますが、実行ポリシーやスクリプトの配置を調整して最適な状態にする必要があることがよくあります。多少の試行錯誤は覚悟しておく必要がありますが、一度手順を習得すれば、かなり信頼できるものになります。
グループポリシーを使用して Windows の起動時に PowerShell スクリプトを実行する方法
起動時にスクリプトを実行すると、たとえば、古いプロトコルを無効にしたり、ユーザーがログインする前にセキュリティ設定を微調整したりする場合などに便利です。少し奇妙に思えますが、重要なのは、すべてのコンピューターがアクセスできるネットワーク共有 (通常はドメイン コントローラー ( ) 上のNetlogon\\domaincontroller\netlogonフォルダー) にスクリプトをコピーして、すべてのコンピューターがアクセスできるようにすることです。
ファイルをNetlogon共有に貼り付けるだけです.ps1。スクリプトをサブフォルダに整理して整理することもできますが、パスが明確で誰でもアクセスできることを確認してください。
GPOエディターに戻り、「コンピューターの構成」→「ポリシー」→「Windowsの設定」→「スクリプト(スタートアップ/シャットダウン)」に移動し、「スタートアップ」を選択します。「追加」をクリックし、完全なUNCパス(例:\\domaincontroller\netlogon\your_script.ps1)を入力します。
複数のスクリプトを実行する場合は、「上へ/下へ」ボタンを使って実行順序を変更できます。ただし、新しいシステムではスクリプトはバイパスモードで実行されるため、PowerShellの実行ポリシー設定はデフォルトでは適用されないことに注意してください。
ちょっと気になる点があります。Windowsはスクリプトを実行する前にネットワーク関連の初期化に数分かかることがあります。ネットワークリソースの準備ができていないことでスクリプトが失敗しないようにするには、「ログオンスクリプトの遅延を構成する」ポリシー(「コンピューターの構成」→「ポリシー」→「管理用テンプレート」→「システム」)を有効にし、1~2分の遅延を設定します。通常、これでネットワーク共有がマウントされるのに十分です。
注:Windows Server 2012R2、Windows 8.1、またはそれ以降のバージョンをご利用の場合、スクリプトはNetLogon共有からバイパスモードで実行され、PowerShell実行ポリシーのチェックをスキップします。ただし、Windows 7またはServer 2008R2をご利用の場合は、実行ポリシーを明示的に設定する必要があります。
実行ポリシーを確認または設定するには、管理者として PowerShell を開き、次のコマンドを実行します。
Get-ExecutionPolicy
または、リモート署名に設定するには(セキュリティと柔軟性のバランスが取れています):
Set-ExecutionPolicy RemoteSigned -Scope Machine -Force
繰り返しになりますが、他のフォルダーからスクリプトを実行する場合は、 GPO でExecutionPolicy をBypassに設定する必要がある場合があります。これは、セキュリティの観点からは理想的ではありませんが、必要な場合もあります。
特に起動時にスクリプトを起動する場合は、次のようpowershell.exeにスクリプト パラメータで直接呼び出すことができます。
-Noninteractive -ExecutionPolicy Bypass -Noprofile -file %~dp0MyPSScript.ps1
これ%~dp0はスクリプト ディレクトリを指すトリックであり、スクリプトの場所に関係なくパスを正しい状態に保つのに役立ちます。
これらの設定を適用した後、マシンを再起動すると、次回の起動時にスクリプトが実行されるはずです。そうでない場合は、権限、パス、実行ポリシーを再確認してください。こうした小さな点が大きな問題を引き起こすこともあります。
ユーザーのログオン/ログオフ時に PowerShell スクリプトを実行する簡単な方法
ユーザーがログインまたはログアウトするたびにスクリプトを実行することが目的の場合も、同様の考え方ですが、ユーザー構成に焦点を当てています。GPOをユーザーアカウントを含むOUにリンクし、「ポリシー」→「Windowsの設定」→「スクリプト(ログオン/ログオフ)」に移動します。ここで、 \\domaincontroller\netlogon\フォルダ内のUNCパスを参照するスクリプトを追加します。
注目すべき点が1つあります。特定のPCのすべてのユーザーにこれを適用したい場合は、「コンピュータの構成」でループバック処理モードを有効にしてください。これにより、Windowsはユーザーアカウントではなくマシンに基づいてユーザーポリシーを適用するため、混乱を避けることができます。
例えば、あるマシン上のすべてのユーザーのログイン時間を記録したい場合、スクリプトをコピーし\\domaincontroller\netlogon\、GPOログオンスクリプトでそのスクリプトを指定するだけです。ユーザーがログインすると、スクリプトはそのユーザーの権限で実行され、イベントビューアーのイベントID 5018で成功を確認することもできます。
スクリプトの実行速度をさらに上げたい場合は、「ログオンスクリプトを同期的に実行」を有効にしてください。これはトレードオフです。ユーザーの遅延は長くなりますが、デスクトップが読み込まれる前にスクリプトが終了します。初期セットアップや重要な設定に最適です。
管理者権限が必要な場合は、スクリプトはユーザー権限で実行されることに注意してください。管理者権限で実行するには、タスクスケジューラを使用し、ログオン時に実行されるタスクを設定し、「最上位の権限で実行」を設定します。設定は少し複雑ですが、スクリプトが一般ユーザーが実行すべきではない高負荷の処理を実行する場合は、それだけの価値があります。
結局のところ、PowerShell スクリプトを GPO 経由でスムーズに実行するには、適切な配置、ポリシーの調整、そして事前のテストが不可欠です。必ずしもうまくいくとは限りませんが、必要な要素が揃えば実現可能です。
まとめ
- PS1スクリプトを\\domaincontroller\netlogonにコピーします。
- スタートアップ スクリプトの場合はコンピューターの下、ログイン スクリプトの場合はユーザーの下の GPO を構成します。
- 必要に応じて実行ポリシーをRemoteSignedまたはBypassに設定する
- ネットワークの準備のためにログオン スクリプトの遅延を構成するなどの遅延設定を調整します
- 特に異なるマシンやWindowsのバージョンで徹底的にテストする
まとめ
PowerShellスクリプトをGPO経由で実行するのは面倒に思えるかもしれませんが、一度設定してしまえば、かなり安定して動作します。権限の問題、実行ポリシー、タイミングの遅延には注意してください。重要なのは、忍耐強く、様々なハードウェアでテストすることです。この方法が、数週間のフラストレーションを回避し、起動時やログオン時にスクリプトを確実に実行できるようになることを願っています。幸運を祈ります!