about_Execution_Policies

簡単な説明

PowerShell の実行ポリシーについて説明し、その管理方法について説明します。

長い説明

PowerShell の実行ポリシーは、PowerShell が構成ファイルを読み込み、スクリプトを実行する条件を制御する安全機能です。 この機能は、悪意のあるスクリプトの実行を防止します。

Windows コンピューターでは、ローカル コンピューター、現在のユーザー、または特定のセッションに対して実行ポリシーを設定できます。 グループ ポリシー設定を使用して、コンピューターとユーザーの実行ポリシーを設定することもできます。

ローカル コンピューターと現在のユーザーの実行ポリシーは、PowerShell 構成ファイルに格納されます。 PowerShell プロファイルに実行ポリシーを設定する必要はありません。 特定のセッションの実行ポリシーはメモリのみに格納され、セッションが閉じられると失われます。

実行ポリシーはセキュリティ境界ではなく、多層防御です。 たとえば、ユーザーは、スクリプトを実行できないときにコマンド ラインでスクリプトの内容を入力することで、ポリシーを簡単にバイパスできます。 代わりに、実行ポリシーは、ユーザーが基本的なルールを設定するのに役立ち、ユーザーが意図せず違反することを防ぎます。

セキュリティ境界の詳細については、PowerShell セキュリティ機能セキュリティ サービス条件に関するセクションを参照してください。

Windows以外のコンピューターでは、既定の実行ポリシーはUnrestrictedされ、変更できません。 Set-ExecutionPolicy コマンドレットは使用可能ですが、PowerShell はサポートされていないというコンソール メッセージが表示されます。 Get-ExecutionPolicyはWindows以外のプラットフォームでUnrestrictedを返しますが、これらのプラットフォームでは Windows セキュリティ Zones が実装されていないため、実際にはBypassと一致します。

PowerShell 実行ポリシー

これらのポリシーの適用は、Windows プラットフォーム上でのみ行われます。 PowerShell 実行ポリシーには次のようなものがあります。

  • AllSigned

    • スクリプトは実行できます。
    • ローカル コンピューター上に記述するスクリプトを含め、すべてのスクリプトと構成ファイルが信頼された発行元によって署名されている必要があります。
    • 「信頼済み」または「信頼されていない」に分類していない発行元からのスクリプトを実行する前に、プロンプトが表示されます。
    • 符号付きではあるが、悪意のあるスクリプトを実行するリスク。
  • Bypass

    • 何もブロックされず、警告やプロンプトは表示されません。
    • この実行ポリシーは、PowerShell スクリプトが大規模なアプリケーションに組み込まれている構成、または PowerShell に独自のセキュリティ モデルがあるプログラムの基盤となっている構成のために設計されています。
  • Default

    • 既定の実行ポリシーを設定します。
    • Windows クライアントとサーバーの RemoteSigned します。
  • RemoteSigned

    • Windows コンピューターの既定の実行ポリシー。
    • スクリプトは実行できます。
    • メールやインスタント メッセージ プログラムを含むインターネットからダウンロードされるスクリプトや構成ファイルには、信頼できる発行者からのデジタル署名が必要です。
    • インターネットからダウンロードされたものではなく、ローカル コンピューターに書かれたスクリプトにはデジタル署名は必要ありません。
    • Unblock-File コマンドレットを使用するなどしてスクリプトのブロックが解除された場合、インターネットからダウンロードされた符号なしのスクリプトを実行します。
    • インターネット以外からの符号なしのスクリプトや、悪意のある可能性のある符号のあるスクリプトを実行するリスク。
  • Restricted

    • 個々のコマンドを許可しますが、スクリプトは許可しません。
    • 書式設定と構成ファイル (.ps1xml)、モジュール スクリプト ファイル (.psm1)、PowerShell プロファイル (.ps1) など、すべてのスクリプト ファイルの実行を防止します。
  • Undefined

    • 現在のスコープに実行ポリシーが設定されていません。
    • すべてのスコープでの実行ポリシーが Undefined である場合、有効な実行ポリシーは Windows クライアントでは Restricted、Windows Server では RemoteSigned になります。
  • Unrestricted

    • Windows以外のコンピューターの既定の実行ポリシー。変更することはできません。
    • 符号なしのスクリプトは実行できます。 悪意のあるスクリプトが実行されるリスクがあります。
    • ローカル イントラネット ゾーン以外のスクリプトや構成ファイルを実行する前に、ユーザーに警告が表示されます。

    Note

    汎用名前付け規則 (UNC) パスとインターネット パスを区別しないシステムでは、UNC パスによって識別されるスクリプトは 、RemoteSigned 実行ポリシーを使用して実行できない可能性があります。

実行ポリシーのスコープと優先順位

特定のスコープでのみ有効な実行ポリシーを設定できます。 このパラメーターは、次の値を受け入れます。

  • MachinePolicy - コンピューターのすべてのユーザーのグループ ポリシーによって設定される
  • UserPolicy - コンピューターの現在のユーザーのグループ ポリシーによって設定される
  • Process - 現在の PowerShell セッションにのみ影響します
  • CurrentUser - 現在のユーザーにのみ影響します
  • LocalMachine - コンピューターのすべてのユーザーに影響するスコープを Default する

Note

MachinePolicyUserPolicy はグループ ポリシーによって設定されます。 スコープをこれらの値のいずれかに設定しようとすると、PowerShell は、スコープがグループ ポリシーによって設定され、変更できないことを示すエラー メッセージを表示します。

実行ポリシーがグループ ポリシーによって定義されていない場合、有効な実行ポリシーは次のように優先順位によって決定されます。

  • Process - 優先順位が最も高い。 Process スコープは、現在の PowerShell セッションにのみ影響します。 実行ポリシーは、レジストリではなく、環境変数 $Env:PSExecutionPolicyPreference に保存されます。 PowerShell セッションが閉じられると、変数と値は削除されます。
  • CurrentUser - 2 番目に高い優先順位。 この設定は、ユーザー固有の powershell.config.json ファイルに格納されます。
  • LocalMachine - 優先順位が最も低い。 この設定は、 $PSHOME/powershell.config.json ファイルに格納されます。

powershell.config.json ファイルの詳細については、「about_PowerShell_Config」を参照してください。

PowerShell を使用した実行ポリシーの管理

現在の PowerShell セッションに有効な実行ポリシーを取得するには、Get-ExecutionPolicy コマンドレットを使用します。

次のコマンドを使用して、有効な実行ポリシーを取得します。

Get-ExecutionPolicy

現在のセッションに影響するすべての実行ポリシーを取得し、優先順位順に表示するには、次のようにします。

Get-ExecutionPolicy -List

その結果は次のサンプル出力のようになります。

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       AllSigned

この場合、現在のユーザーに対する実行ポリシーがローカル コンピューターに設定された実行ポリシーよりも優先されるため、有効な実行ポリシーは RemoteSigned になります。

特定のスコープの実行ポリシー セットを取得するには、ScopeGet-ExecutionPolicy パラメーターを使用します。

たとえば、次のコマンドは、CurrentUser スコープの実行ポリシーを取得します。

Get-ExecutionPolicy -Scope CurrentUser

実行ポリシーを変更する

Windows コンピューターの PowerShell 実行ポリシーを変更するには、Set-ExecutionPolicy コマンドレットを使用します。 変更内容はすぐに反映されます。 PowerShell を再起動する必要はありません。

スコープ LocalMachine または CurrentUser の実行ポリシーを設定した場合、変更は構成ファイルに保存され、再度変更するまで有効なままです。

Process スコープの実行ポリシーを設定した場合、構成ファイルには保存されません。 実行ポリシーは、現在のプロセスと子プロセスが閉じられるまで保持されます。

Note

Windows Vista 以降のバージョンの Windows で、ローカル コンピューターの実行ポリシーを変更するコマンドを実行するには、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 パラメーターを使用して、新しい PowerShell セッションの実行ポリシーを設定できます。 ポリシーは現在のセッションと子セッションのみに影響します。

新しいセッションに対して実行ポリシーを設定するには、cmd.exe や PowerShell などのコマンド ラインで PowerShell を起動し、pwsh.exe パラメーターを使用して実行ポリシーを設定します。

次に例を示します。

pwsh.exe -ExecutionPolicy AllSigned

設定した実行ポリシーは、構成ファイルに格納されません。 代わりに $Env:PSExecutionPolicyPreference 環境変数に格納されます。 ポリシーが設定されているセッションを閉じると、変数は削除されます。 変数の値を編集してポリシーを変更することはできません。

セッション中は、セッションに設定されている実行ポリシーが、ローカル コンピューターまたは現在のユーザーの構成ファイルに設定されている実行ポリシーよりも優先されます。 ただし、グループ ポリシーを使用して設定された実行ポリシーより優先されることはありません。

グループ ポリシーを使用して実行ポリシーを管理する

[スクリプトの実行を有効にする] グループ ポリシー設定を使って、企業内のコンピューターの実行ポリシーを管理できます。 このグループ ポリシー設定は、すべてのスコープで PowerShell に設定された実行ポリシーをオーバーライドします。

[スクリプトの実行を有効にする] ポリシー設定は次のとおりです。

  • [スクリプトの実行を有効にする] を無効にすると、スクリプトは実行されません。 これは、Restricted 実行ポリシーと同等です。

  • [スクリプトの実行を有効にする] を有効にすると、実行ポリシーを選択できます。 グループ ポリシーの設定は、次の実行ポリシーの設定と同等です。

    グループ ポリシー 実行ポリシー
    すべてのスクリプトを許可する Unrestricted
    ローカル スクリプトおよびリモートの署名済みスクリプトを許可する RemoteSigned
    署名済みスクリプトのみ許可する AllSigned
  • [スクリプトの実行を有効にする] を構成しない場合、影響はありません。 PowerShell で設定した実行ポリシーは有効です。

PowerShellCoreExecutionPolicy.admファイルとPowerShellCoreExecutionPolicy.admx ファイルは、次のパスのグループ ポリシー エディターの [コンピューターの構成] ノードと [ユーザー構成] ノードにスクリプト実行ポリシーを有効にします

Administrative Templates\Windows Components\Windows PowerShell

[コンピューターの構成] ノードで設定されたポリシーは、[ユーザーの構成] ノードで設定されたポリシーよりも優先されます。

詳細については、about_Group_Policy_Settingsを参照してください。

署名されたスクリプトと署名されていないスクリプトを管理する

Windows では、Internet Explorer や Microsoft Edge などのプログラムが、ダウンロードされるファイルに別のデータ ストリームを追加します。 これは、ファイルが "インターネットから取得した" ことを示します。 PowerShell 実行ポリシーが RemoteSigned である場合、PowerShell ではメールやインスタント メッセージ プログラムを含むインターネットからダウンロードされる符号なしスクリプトは実行されません。

スクリプトに符号を付けることも、実行ポリシーを変更せずに符号なしのスクリプトを実行することもできます。

PowerShell 3.0 以降では、 コマンドレットの Get-Item パラメーターを使用して、インターネットからダウンロードされたためにブロックされているファイルを検出できます。 Unblock-File コマンドレットを使用してスクリプトをブロック解除し、PowerShell でそれらを実行できるようにします。

詳細については、about_SigningGet-ItemUnblock-File を参照してください。

Note

他の方法でファイルをダウンロードすると、インターネット ゾーンから取得したファイルであることが表示されない場合があります。 次に例をいくつか示します。

  • curl.exe
  • Invoke-RestMethod
  • Invoke-WebRequest

Windows Server Core と Windows 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 の実行ポリシーを使用する場合、問題を回避するゾーン チェックは必要ありません。

こちらも参照ください