Windows でプログラミング環境を構築するために、ソフトウェアや各種ツールをインストールする際、配布元となる公式サイトにて、PowerShell スクリプトの実行を指定される場合も多いと思います。
その際の予備知識として、実行ポリシーの概要を抑えておくと、公式マニュアルの理解と作業が進みます。
PowerShell の実行ポリシー
悪意のある PowerShell スクリプトの実行を防ぐ機能が実行ポリシーです。
ユーザ自身がスクリプトの実行条件を設定することで、意図しない動作を防ぐためにも利用されます。
PowerShell スクリプト
拡張子が.ps1で定義される PowerShell 上で実行可能なスクリプトファイルです。
変数定義や演算処理、ファイル操作など、様々な処理を記述して実行することができます。
参考までに、拡張子は「PowerShell version 1」に由来し、当初はバージョンに合わせて拡張子の数字も対応させる想定だったようですが、1 がそのまま残り継承されています。
実行ポリシーの種類
主に下表の 5 種類の実行ポリシーが用意されています。
デフォルトはRestrictedであり、スクリプトの実行は無効になっています。
| 実行ポリシー | 規則 |
| Restricted | 全てのスクリプトの実行禁止 |
| AllSigned | 署名付きのスクリプトのみ実行可能 |
| RemoteSigned | 非ローカルスクリプトは、署名付きの場合に実行可能(ローカルスクリプトスクリプトは実行可能) |
| Unrestricted | 全てのスクリプトが実行可能だが、非ローカルスクリプトの実行にはユーザの許可が必要 |
| Bypass | 警告やユーザの許可無しに全てのスクリプトが実行可能 |
非ローカルスクリプトとは、インターネットからダウンロードしたスクリプトを指し、ローカルスクリプトは、ローカルマシンで作成されたスクリプトを指します。
また、署名とは一般的に認証局(CA: Certification Authority)が発行するデジタル証明書を利用した電子署名を意味します。
署名付きのスクリプトの信頼性は高いですが、必ずしも悪意がないとは言えないことに注意が必要です。
実行ポリシーとスクリプトの実行可否
スクリプトの実行可否をまとめると下表になります。
| 実行ポリシー | 署名付き | 署名無し | |
| ローカルファイル | 非ローカルファイル | ||
| Restricted | × | × | × |
| AllSigned | 〇 | × | × |
| RemoteSigned | 〇 | 〇 | × |
| Unrestricted | 〇 | 〇 | 〇(許可する場合) |
| Bypass | 〇 | 〇 | 〇 |
実行ポリシーのスコープ
実行ポリシーの設定範囲を指定することができます。
下表に示す通り、5 種類のスコープがあります。
デフォルトはLocalMachineであり、オプションで指定しない場合、このスコープが既定となります。
| スコープ | 概要 |
| MachinePolicy | 全てのユーザに対し、グループポリシーに基づき実行ポリシーを設定 |
| UserPolicy | 現在のユーザに対し、グループポリシーに基づき実行ポリシーを設定 |
| Process | 実行中の PowerShell セッションにのみ実行ポリシーを設定 |
| CurrentUser | 現在のユーザに対し、実行ポリシーを設定 |
| LocalMachine | 全てのユーザーに対し、実行ポリシーを設定 |
グループポリシーとは、複数のコンピュータやユーザ設定を一元管理するための規則です。
通常、企業や学校等のコンピュータにおいて、特定のディレクトリへのアクセスや、ツールの利用を禁止するなどのシーンで利用されます。
設定方法
確認
現在設定されている有効な実行ポリシーを下記コマンドで確認します。
Get-ExecutionPolicy
全てのスコープに対する実行ポリシーを取得し、制限の優先順位を表示する場合は、-Listオプションを付けます。
Get-ExecutionPolicy -List

デフォルトの場合、LocalMachineにRestricted が設定されており、スクリプトを実行するとエラーがリターンされます。

参考までに「test.ps1」は、下記の「Hello World!」を標準出力する単純なスクリプトです。
echo "Hello World!"
変更
実行ポリシーを指定して設定します。
Set-ExecutionPolicy <policy>
コマンド直後に変更が反映され、 PowerShell を再起動する必要はありません。
現在のユーザに対して実行ポリシーを設定
Set-ExecutionPolicy <policy> -Scope CurrentUser
以下は「RemoteSigned」に設定する例です。(「y」を入力してリターン)

この場合、現在のユーザの実行ポリシーがローカルコンピュータの実行ポリシーよりも優先されるため、有効な実行ポリシーはRemoteSignedになります。
この実行ポリシー下では、スクリプト(ローカルファイル)を実行することができます。
既定のスコープがLocalMachine(コンピュータにおける全ユーザへの設定反映)であることに起因し、実行ポリシーの設定を書き込むレジストリへのアクセスが拒否されます。

同様のエラーが生じた場合、管理者権限で設定するか、-Scope CurrentUserのオプションを付ける必要があります。
管理者モードで実行ポリシーを設定
管理者権限で設定する場合、スコープのオプションを省略すると、LocalMachine(既定のスコープ)に対する実行ポリシーの変更となります。
管理者モードで設定するには、PowerShell のアイコンを右クリックして 管理者として実行する か、下記コマンドの入力により、別ウィンドウで管理者権限の PowerShell を起動し、実行ポリシーを指定します。
Start-Process PowerShell.exe -Verb runas
以下は「AllSigned」に設定する例です。(「y」を入力してリターン)

上記の場合、実行ポリシーを変更するコマンドは成功していますが、有効な実行ポリシーは変更されません。
実行条件がより限定された規則を定義する現在のユーザの実行ポリシーによって上書きされています。
設定時は、有効な実行ポリシーを適宜確認すると良いでしょう。
削除
特定のスコープの実行ポリシーをUndefinedに設定することが削除に値します。
Set-ExecutionPolicy Undefined -Scope <scope>
以下は「CurrentUser」と「LocalMachine」との各スコープに対して「Undefined」を設定した例です。
どのスコープにも実行ポリシーが設定されていない場合、有効な実行ポリシーは、Restrictedになります。

実行ポリシーの設定に関わる基本的なコマンドは以上です。
CHAM 

