PowerShellスクリプト実行ポリシーの設定方法|確認・変更からGPO一括管理まで
Windowsの初期状態では、セキュリティ保護のためPowerShellスクリプト(.ps1ファイル)の実行が無効化されています。これは、信頼されていないコードや悪意のあるスクリプトの実行を防ぐための重要な仕組みであり、スクリプトの実行可否は「実行ポリシー(Execution Policy)」という設定によって決定されます。
本記事では、Windowsで利用可能なPowerShellスクリプト実行ポリシーの種類、Set-ExecutionPolicyコマンドレットによる変更方法、さらにグループポリシー(GPO)を活用してActive Directoryドメイン内のコンピューターへ一括適用する手順までを解説します。
「このシステムではスクリプトの実行が無効になっています」エラーとは
クリーンインストール直後のWindows 10でPowerShellスクリプト(PS1ファイル)を実行しようとすると、次のようなエラーが発生します。
File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170. + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
このエラーは「スクリプトの実行がこのシステムで無効になっている」ことを示しています。現在の実行ポリシーの設定値は、以下のコマンドで確認できます。
Get-ExecutionPolicy
実行ポリシーの種類とそれぞれの挙動
- Restricted:すべてのPowerShellスクリプトの実行を禁止し、PSコンソールでの対話的なコマンド入力のみ許可します。Windows 10などのクライアントOSの既定値です。
- AllSigned:信頼された発行者によるデジタル署名付きスクリプトのみ実行を許可します(自己署名証明書で署名し、信頼されたルート証明機関に追加する運用も可能)。信頼されていないスクリプトを実行しようとすると、次のような警告が表示されます。
Do you want to run software from this untrusted publisher? File .ps1 is published by CN=test1 and is not trusted on your system. Only run scripts from trusted publishers.
- RemoteSigned:ローカルのスクリプトは制限なく実行でき、リモート由来のスクリプトはデジタル署名がある場合のみ実行できます。インターネットからダウンロードしたファイルや、UNCパスの共有フォルダーにある未署名のPS1ファイルは実行できません。Windows Serverの既定値です。
- Unrestricted:すべてのPowerShellスクリプトの実行を許可します。ただし、インターネットから取得したサードパーティ製スクリプトを実行する際には確認メッセージが表示されることがあります。
- Bypass:警告なしですべてのスクリプト実行を許可します。GPO、SCCM、タスクスケジューラなどによる自動実行向けの設定で、恒常的な使用は推奨されません。
- Default:実行ポリシーを既定値に戻します。Windows 10ではRestricted、Windows Server 2016ではRemoteSignedが既定です。
- Undefined:ポリシー未設定の状態です。この場合、クライアントOSにはRestricted、サーバーOSにはRemoteSignedが適用されます。
実行ポリシーを変更してスクリプト実行を許可する方法
実行ポリシーの現在値を変更するには、Set-ExecutionPolicyコマンドレットを使用します。例として、ローカルのPS1スクリプトの実行を許可してみましょう。
Set-ExecutionPolicy RemoteSigned
実行すると確認を求められるので、Y(はい)またはA(すべてはい)を入力して確定します。確認プロンプトを表示せずに即時変更したい場合は、-Forceパラメーターを付けます。
Set-ExecutionPolicy RemoteSigned -Force
なお、ポリシーをUnrestrictedに設定していても、UNCパスの共有フォルダーやインターネットからダウンロードしたリモートスクリプトを実行する際には、次のような確認メッセージが表示されます。
Security warning Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message. Do you want to run? [D] Do not run [R] Run once [S] Suspend [?] Help (default is "D")
ローカルとリモートのスクリプト判定基準(ZoneId)
PowerShellは、スクリプトが「ローカル」なのか「リモート」なのかをどのように判別しているのでしょうか。その鍵となるのが、ブラウザーがダウンロード時にファイルの代替データストリームへ書き込むZoneId識別子です。ファイルのプロパティで「許可する(Unblock)」にチェックを入れるか、Unblock-Fileコマンドレットを実行することでゾーン情報を消去できます。
実行ポリシーのスコープ(適用範囲)
実行ポリシーには、優先度の異なる複数のスコープが存在します。
- MachinePolicy:GPOで設定され、コンピューターの全ユーザーに適用されます。
- UserPolicy:同じくGPOで設定され、コンピューターのユーザーに適用されます。
- Process:現在のPowerShellセッションにのみ有効です(powershell.exeプロセス終了後にリセットされます)。
- CurrentUser:現在のユーザーにのみ適用されます(HKEY_CURRENT_USERレジストリキーに保存)。
- LocalMachine:コンピューターの全ユーザーに適用されます(HKEY_LOCAL_MACHINEレジストリキーに保存)。
スコープはSet-ExecutionPolicyの-Scopeパラメーターで指定します。
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
全スコープの現在の設定は、次のコマンドで一覧表示できます。
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Bypass
CurrentUser Undefined
LocalMachine RemoteSigned
実行ポリシーのレジストリ保存場所
CurrentUserおよびLocalMachineスコープに対してSet-ExecutionPolicyで設定した値は、レジストリに保存されます。たとえば、次のコマンドを実行したとします。
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Restricted -Force
この場合、レジストリキーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShellを開くと、REG_SZ型のExecutionPolicy値がRestrictedに変更されていることを確認できます(設定可能な値はRestricted、AllSigned、RemoteSigned、Bypass、Unrestricted、Undefinedの6種類です)。
CurrentUserスコープの設定は、HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell配下に格納されます。つまり、グループポリシー基本設定(GPP)経由でレジストリを配布すれば、実行ポリシーを一括展開することも可能です。
企業環境では、LocalMachineレベルでAllSignedを採用するのが最も一般的です。セキュリティと利便性のバランスに優れています。個人利用であればRemoteSignedで十分でしょう。Bypassは、GPOやタスクスケジューラからのスクリプト実行など、特定のタスクに限定して使うべきです。
GPOを使ってActive Directoryドメインで実行ポリシーを設定する
Active Directoryドメイン環境では、グループポリシー(GPO)を使って、サーバーやドメイン参加コンピューターのPowerShell実行ポリシーを一括構成できます。
- ドメインGPOエディター(
gpmc.msc)で新しいGPOを作成(または既存のGPOを編集)し、対象コンピューターが含まれるOUにリンクします。 - GPOエディターで[コンピューターの構成]→[ポリシー]→[管理用テンプレート]→[Windowsコンポーネント]→[Windows PowerShell]を開き、「スクリプトの実行を有効にする(Turn on Script Execution)」ポリシーを探します。ユーザー構成側にも同名のポリシーがありますが、コンピューターポリシーの方が優先されます。
- このポリシーには3つの設定値があります。
- 署名済みスクリプトのみ許可:AllSigned相当
- ローカルスクリプトおよびリモートの署名済みスクリプトを許可:RemoteSigned相当
- すべてのスクリプトを許可:Unrestricted相当
- 希望する値を設定してGPOを保存し、クライアント側でグループポリシーを更新(
gpupdate /force)します。 Get-ExecutionPolicy -Listを実行し、MachinePolicyスコープに新しい設定が反映されていることを確認します。
GPOで実行ポリシーを構成した後は、各コンピューターで手動による変更はできなくなります。GPO適用対象のマシンでSet-ExecutionPolicyを実行すると、次のようなエラーが表示されます。
Set-ExecutionPolicy : Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings.
スタンドアロン(非ドメイン参加)のコンピューターであれば、ローカルグループポリシーエディター(gpedit.msc)から同様の手順で設定できます。
実行ポリシーを変更せずにスクリプトを実行する(バイパス)方法
実行ポリシーの設定を変更せずに、一時的にPowerShellスクリプトを実行したい場合に使えるテクニックもあります。ここでは例として、管理者権限で実行されているかどうかをチェックする簡単なPS1スクリプトを取り上げます。
1. 標準入力経由でスクリプトを実行する
Get-Contentでスクリプトの中身を読み出し、それをPowerShellコンソールの標準入力に渡す方法です。
Get-Content c:\ps\check_process_elevation.ps1 | PowerShell.exe -noprofile -
2. Bypassポリシーで新しいPowerShellプロセスを起動する
powershell.exeの起動時に-executionpolicy bypassオプションを指定すれば、そのプロセス内でのみポリシーを回避できます。
powershell.exe -noprofile -executionpolicy bypass -file c:\ps\check_process_elevation.ps1
いずれの方法でも、システム全体の実行ポリシー設定に影響を与えることなく、目的のスクリプトを実行できます。
-
Linuxでシェルスクリプトを作成する方法【初心者向け基本ガイド】
シェルスクリプトの作成は、Linuxユーザーが必ず身につけておきたい最重要スキルのひとつです。シェルスクリプトを活用すれば、手作業で一行ずつ実行すると面倒な反復タスクを効率的に自動化できます。このチュートリアルでは、すべてのLinuxユーザーが押さえておくべき基本的なシェルスクリプトの操作方法を、実例とともにわかりやすく解説します。1. 簡単なシェルスクリプトを作成するシェルスクリプトとは、ASCIIテキストで構成されたファイルのことです。まずはテキストエディタを使って、簡単なシェルスクリプトを作成してみましょう。テキストエディタにはコマンドライン型とGUI型のさまざまな種類がありますが、本ガ
-
PowerShellスクリプトに一時停止(ポーズ)を追加する方法【具体例つき】
この記事では、PowerShellスクリプトに一時停止(ポーズ)を追加する方法を解説します。 一時停止や待機コマンドを追加する方法はいくつかあります。以下では、それぞれの方法を具体例とともにわかりやすく紹介していきます。 PowerShellスクリプトに一時停止を追加する基本の方法 最も基本的なのは、Start-Sleepコマンドレットを使う方法です。以下の手順で追加できます。 スタートメニューから「PowerShell ISE」を開きます 一時停止コマンドを追加したいPowerShellスクリプトを開きます 一時停止させたい箇所に、start-sleep -Seconds 5という行を追