プログラミング初心者向け!Windows PowerShell の実行ポリシーの基本を理解する

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
有効な実行ポリシーの確認と優先順位の確認

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

スクリプトの実行エラー

参考までに「test.ps1」は、下記の「Hello World!」を標準出力する単純なスクリプトです。

echo "Hello World!"

変更

実行ポリシーを指定して設定します。

Set-ExecutionPolicy <policy>

コマンド直後に変更が反映され、 PowerShell を再起動する必要はありません。

現在のユーザに対して実行ポリシーを設定

Set-ExecutionPolicy <policy> -Scope CurrentUser

以下は「RemoteSigned」に設定する例です。(「y」を入力してリターン)

実行ポリシーの変更(CurrentUser)

この場合、現在のユーザの実行ポリシーがローカルコンピュータの実行ポリシーよりも優先されるため、有効な実行ポリシーは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になります。

実行ポリシーの削除

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

Windows コマンド環境のすべて

著者 : 五十嵐 貴之 / 出版社 : ソシム