about_Execution_Policies
簡単な説明
PowerShell の実行ポリシーについて説明し、その管理方法について説明します。
詳細な説明
PowerShell の実行ポリシーは、PowerShell が構成ファイルを読み込み、スクリプトを実行する条件を制御する安全機能です。 この機能は、悪意のあるスクリプトの実行を防止します。
Windows コンピューターでは、ローカル コンピューター、現在のユーザー、または特定のセッションに対して実行ポリシーを設定できます。 グループ ポリシー設定を使用して、コンピューターとユーザーの実行ポリシーを設定することもできます。
ローカル コンピューターと現在のユーザーの実行ポリシーはレジストリに保存されます。 PowerShell プロファイルに実行ポリシーを設定する必要はありません。 特定のセッションの実行ポリシーはメモリのみに格納され、セッションが閉じられると失われます。
実行ポリシーは、ユーザー アクションを制限するセキュリティ システムではありません。 たとえば、スクリプトを実行できない場合、ユーザーはコマンド ラインでスクリプトの内容を入力することで、簡単にポリシーを回避できます。 代わりに、実行ポリシーは、ユーザーが基本的なルールを設定するのに役立ち、ユーザーが意図せず違反することを防ぎます。
Windows 以外のコンピューターでは、既定の実行ポリシーは Unrestricted であり、変更できません。 Set-ExecutionPolicy
コマンドレットは使用可能ですが、PowerShell はサポートされていないというコンソール メッセージが表示されます。 Windows 以外のプラットフォームでは Get-ExecutionPolicy
は Unrestricted を返しますが、これらのプラットフォームは Windows セキュリティ ゾーンを実装していないため、実際の動作は Bypass と一致します。
PowerShell 実行ポリシー
これらのポリシーの適用は、Windows プラットフォーム上でのみ行われます。 PowerShell 実行ポリシーには次のようなものがあります。
AllSigned
- スクリプトは実行できます。
- ローカル コンピューター上に記述するスクリプトを含め、すべてのスクリプトと構成ファイルが信頼された発行元によって署名されている必要があります。
- 「信頼済み」または「信頼されていない」に分類していない発行元からのスクリプトを実行する前に、プロンプトが表示されます。
- 符号付きではあるが、悪意のあるスクリプトを実行するリスク。
Bypass
- 何もブロックされず、警告やプロンプトは表示されません。
- この実行ポリシーは、PowerShell スクリプトが大規模なアプリケーションに組み込まれている構成、または PowerShell に独自のセキュリティ モデルがあるプログラムの基盤となっている構成のために設計されています。
Default
- 既定の実行ポリシーを設定します。
- Windows クライアントに対する Restricted。
- Windows サーバーに対する RemoteSigned。
RemoteSigned
- Windows サーバー コンピューターに対する既定の実行ポリシー。
- スクリプトは実行できます。
- メールやインスタント メッセージ プログラムを含むインターネットからダウンロードされるスクリプトや構成ファイルには、信頼できる発行者からのデジタル署名が必要です。
- インターネットからダウンロードされたものではなく、ローカル コンピューターに書かれたスクリプトにはデジタル署名は必要ありません。
Unblock-File
コマンドレットを使用するなどしてスクリプトのブロックが解除された場合、インターネットからダウンロードされた符号なしのスクリプトを実行します。- インターネット以外からの符号なしのスクリプトや、悪意のある可能性のある符号のあるスクリプトを実行するリスク。
Restricted
- Windows クライアント コンピューター向けの既定の実行ポリシー。
- 個々のコマンドは許可されますが、スクリプトは許可されません。
- 書式設定と構成ファイル (
.ps1xml
)、モジュール スクリプト ファイル (.psm1
)、PowerShell プロファイル (.ps1
) など、すべてのスクリプト ファイルの実行を防止します。
Undefined
- 現在のスコープには実行ポリシーが設定されていません。
- すべてのスコープでの実行ポリシーが Undefined である場合、有効な実行ポリシーは Windows クライアントでは Restricted、Windows Server では RemoteSigned になります。
Unrestricted
- Windows 以外のコンピューターの既定の実行ポリシーであり、変更できません。
- 符号なしのスクリプトは実行できます。 悪意のあるスクリプトが実行されるリスクがあります。
- ローカル イントラネット ゾーン以外のスクリプトや構成ファイルを実行する前に、ユーザーに警告が表示されます。
Note
汎用名前付け規則 (UNC) パスとインターネット パスを区別しないシステムでは、UNC パスで特定されるスクリプトは RemoteSigned 実行ポリシーでの実行が許可されない場合があります。
実行ポリシーのスコープ
特定のスコープでのみ有効な実行ポリシーを設定できます。
Scope の有効な値はMachinePolicy、UserPolicy、Process、CurrentUser、LocalMachine です。 LocalMachine は実行ポリシーを設定する場合の既定値です。
Scope の値は、優先順位順に一覧表示されます。 優先されるポリシーは、より制限の厳しいポリシーがより低い優先レベルで設定されている場合でも、現在のセッションでは有効です。
詳細については、「Set-ExecutionPolicy」を参照してください。
MachinePolicy
グループ ポリシーによってコンピューターのすべてのユーザーに対して設定します。
UserPolicy
グループ ポリシーによってコンピューターの現在のユーザーに対して設定します。
Process
Process スコープは、現在の PowerShell セッションのみに影響します。 実行ポリシーは、レジストリではなく環境変数
$env:PSExecutionPolicyPreference
に保存されます。 PowerShell セッションが閉じられると、変数と値は削除されます。CurrentUser
実行ポリシーは、現在のユーザーのみに影響します。 これは、HKEY_CURRENT_USER レジストリ サブキーに格納されています。
LocalMachine
実行ポリシーは、現在のコンピューターのすべてのユーザーに影響します。 これは、HKEY_LOCAL_MACHINE レジストリ サブキーに格納されています。
PowerShell を使用した実行ポリシーの管理
現在の PowerShell セッションに有効な実行ポリシーを取得するには、Get-ExecutionPolicy
コマンドレットを使用します。
次のコマンドを使用して、有効な実行ポリシーを取得します。
Get-ExecutionPolicy
現在のセッションに影響するすべての実行ポリシーを取得し、優先順位順に表示するには、次のようにします。
Get-ExecutionPolicy -List
その結果は次のサンプル出力のようになります。
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine AllSigned
この場合、現在のユーザーに対する実行ポリシーがローカル コンピューターに設定された実行ポリシーよりも優先されるため、有効な実行ポリシーは RemoteSigned になります。
特定のスコープに設定された実行ポリシーを取得するには、Get-ExecutionPolicy
の Scope パラメーターを使用します。
たとえば、次のコマンドでは、CurrentUser スコープの実行プランが表示されます。
Get-ExecutionPolicy -Scope CurrentUser
実行ポリシーを変更する
Windows コンピューターの PowerShell 実行ポリシーを変更するには、Set-ExecutionPolicy
コマンドレットを使用します。 変更内容はすぐに反映されます。 PowerShell を再起動する必要はありません。
スコープ LocalMachine または CurrentUser に対して実行ポリシーを設定した場合、変更はレジストリに保存され、もう一度変更するまで有効です。
Process スコープに実行ポリシーを設定しても、レジストリには保存されません。 実行ポリシーは、現在のプロセスと子プロセスが閉じられるまで保持されます。
Note
Windows の Windows Vista 以降のバージョンで、ローカル コンピューター (LocalMachine スコープ) に対して実行ポリシーを変更するコマンドを実行するには、[管理者として実行] オプションで PowerShell を起動する必要があります。
実行ポリシーを変更するには、次のようにします。
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
次に例を示します。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
特定のスコープの実行ポリシーを設定するには、次のようにします。
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
次に例を示します。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
実行ポリシーを変更するコマンドは成功しても、有効な実行ポリシーは変更されません。
たとえば、ローカル コンピューターに対して実行ポリシーを設定するコマンドは成功しますが、現在のユーザーの実行ポリシーで上書きされる場合があります。
実行ポリシーを削除する
特定のスコープに対する実行ポリシーを削除し、実行ポリシーを Undefined に設定します。
たとえば、ローカル コンピューターのすべてのユーザーに対する実行ポリシーを削除するには、次のようにします。
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
Scope に対する実行ポリシーを削除するには、次のようにします。
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
任意のスコープに実行ポリシーが設定されていない場合、有効な実行ポリシーは Restricted になります。これは、Windows クライアントの既定値です。
1 つのセッションに異なるポリシーを設定する
pwsh.exe
の ExecutionPolicy パラメーターを使用して、新しい PowerShell セッションの実行ポリシーを設定できます。 ポリシーは現在のセッションと子セッションのみに影響します。
新しいセッションに対して実行ポリシーを設定するには、cmd.exe
や PowerShell などのコマンド ラインで PowerShell を起動し、pwsh.exe
の ExecutionPolicy パラメーターを使用して実行ポリシーを設定します。
次に例を示します。
pwsh.exe -ExecutionPolicy AllSigned
設定した実行ポリシーはレジストリに格納されません。 代わりに $env:PSExecutionPolicyPreference
環境変数に格納されます。 ポリシーが設定されているセッションを閉じると、変数は削除されます。 変数の値を編集することによって、ポリシーを変更することはできません。
セッション中は、セッションに対して設定された実行ポリシーが、ローカル コンピューターまたは現在のユーザーに対してレジストリに設定された実行ポリシーよりも優先されます。 ただし、グループ ポリシーを使用して設定された実行ポリシーより優先されることはありません。
グループ ポリシーを使って実行ポリシーを管理する
[スクリプトの実行を有効にする] グループ ポリシー設定を使って、企業内のコンピューターの実行ポリシーを管理できます。 このグループ ポリシー設定は、すべてのスコープで PowerShell に設定された実行ポリシーをオーバーライドします。
[スクリプトの実行を有効にする] ポリシー設定は次のとおりです。
[スクリプトの実行を有効にする] を無効にすると、スクリプトは実行されません。 これは、Restricted 実行ポリシーと同等です。
[スクリプトの実行を有効にする] を有効にすると、実行ポリシーを選択できます。 グループ ポリシーの設定は、次の実行ポリシーの設定と同等です。
グループ ポリシー 実行ポリシー すべてのスクリプトを許可する Unrestricted ローカル スクリプトおよびリモートの署名済みスクリプトを許可する RemoteSigned 署名済みスクリプトのみ許可する AllSigned [スクリプトの実行を有効にする] を構成しない場合、影響はありません。 PowerShell で設定した実行ポリシーは有効です。
PowerShellExecutionPolicy.adm と PowerShellExecutionPolicy.admx のファイルを使って、グループ ポリシー エディターの次のパスにある [コンピューターの構成] と [ユーザーの構成] の各ノードに [スクリプトの実行を有効にする] ポリシーを追加します。
Windows XP と Windows Server 2003 の場合:
Administrative Templates\Windows Components\Windows PowerShell
Windows Vista と以降のバージョンの Windows の場合:
Administrative Templates\Classic Administrative Templates\Windows Components\Windows PowerShell
[コンピューターの構成] ノードで設定されたポリシーは、[ユーザーの構成] ノードで設定されたポリシーよりも優先されます。
詳細については、about_Group_Policy_Settingsを参照してください。
優先される実行ポリシー
セッションに有効な実行ポリシーを決定する場合、PowerShell は次のような優先順位で実行ポリシーを評価します。
Group Policy: MachinePolicy
Group Policy: UserPolicy
Execution Policy: Process (or pwsh.exe -ExecutionPolicy)
Execution Policy: LocalMachine
Execution Policy: CurrentUser
符号付きスクリプトと符号なしスクリプトの管理
Windows では、Internet Explorer や Microsoft Edge などのプログラムが、ダウンロードされるファイルに別のデータ ストリームを追加します。 これは、ファイルが "インターネットから取得した" ことを示します。 PowerShell 実行ポリシーが RemoteSigned である場合、PowerShell ではメールやインスタント メッセージ プログラムを含むインターネットからダウンロードされる符号なしスクリプトは実行されません。
スクリプトに符号を付けることも、実行ポリシーを変更せずに符号なしのスクリプトを実行することもできます。
PowerShell 3.0 以降では、Get-Item
コマンドレットの Stream パラメーターを使用して、インターネットからダウンロードされたためにブロックされているファイルを検出できます。 Unblock-File
コマンドレットを使用してスクリプトをブロック解除し、PowerShell でそれらを実行できるようにします。
詳細については、about_Signing、Get-Item、Unblock-File を参照してください。
Note
他の方法でファイルをダウンロードすると、インターネット ゾーンから取得したファイルであることが表示されない場合があります。 次に例をいくつか示します。
curl.exe
Invoke-RestMethod
Invoke-WebRequest
Windows Server Core と Window Nano Server における実行ポリシー
特定の条件下で Windows Server Core または Windows Nano Server 上で PowerShell 6 を実行すると、次のエラーが発生して実行ポリシーが失敗する場合があります。
AuthorizationManager check failed.
At line:1 char:1
+ C:\scriptpath\scriptname.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PowerShell は、Windows デスクトップ シェル (explorer.exe
) の API を使用して、スクリプト ファイルのゾーンを検証します。 Windows シェルは、Windows Server Core および Windows Nano Server では使用できません。
Windows デスクトップ シェルが使用できないか、応答しない場合でも、Windows システムでこのエラーが発生する可能性があります。 たとえば、サインオン中に、Windows デスクトップの準備が整う前に PowerShell ログオン スクリプトの実行が開始され、失敗する可能性があります。
ByPass または AllSigned の実行ポリシーを使用すると、ゾーン チェックが不要になるため、問題を回避できます。
関連項目
PowerShell