Powershellの実行ポリシーを変更する(Set-ExecutionPolicy)

Powershell Powershell

powershellの実行ポリシーを変更する方法についてまとめてみました。

powershell を実行する際には実行ポリシーが適切でないとエラーとなり実行できません。

広告

powershell実行時に出てくるエラー

実行ポリシーが [Restricted] となっている状態でpowershellを実行すると、
実行時に「このシステムではスクリプトの実行が無効になっている・・・・」というエラーが出ます。

実際に [Restricted] で powershell を実行した場合には以下のようになります。

PS C:\> C:\hogehoge\test.ps1
C:\hogehoge\test.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\hogehoge\test.ps1 を読み込む
ことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照し
てください。
発生場所 行:1 文字:1
+ C:\hogehoge\test.ps1
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\>

実行ポリシーの種類

実行ポリシーには以下の種類があります。
 ※「安全性」については完全に個人的な意見になりますのであくまでも目安にしていただければと思います。

実行ポリシー簡単な説明セキュリティ
Restrictedスクリプト実行不可
・Windowsクライアントでは既定のポリシー
AllSignedスクリプト実行可能
・デジタル署名が付いている必要がある
RemoteSignedスクリプト実行可能
・ローカルで作成されたスクリプトは実行可能
・インターネットからダウンロードしたスクリプト実行にはデジタル署名が必要
・Windowsサーバーの既定のポリシー
Unrestrictedスクリプト実行可能
・インターネットからダウンロードしたスクリプトであっても署名なしで実行が可能
 ただし、その場合実行時に警告が表示される
Bypassスクリプト実行可能
・どんなスクリプトでも警告が表示されることなく実行可能

上でも少し触れた [Restricted] のみスクリプト実行不可のポリシーになります。
逆に言うと [Restricted] 以外のポリシーではスクリプトの実行が可能です。

ただ [AllSigned] の「デジタル署名が付いている必要がある」という条件も少し面倒なので、
個人的には、
powershell を絶対に実行しないシステムやサーバであれば [Restricted] にした方が良いでしょうし、
少しでも powershell を実行するといった場合には [RemoteSigned] でよいと思っています。

実行ポリシーの確認方法

Get-ExecutionPolicyコマンドで実行ポリシーを確認することができます。

PS C:\> Get-ExecutionPolicy
RemoteSigned
PS C:\>

上の結果では [RemoteSigned] が設定されていることが分かります。

実行ポリシーの変更方法

Set-ExecutionPolicyコマンドで実行ポリシーを変更することが可能です。

Set-ExecutionPolicy [[Restricted] or [Allsigned] or [RemoteSigned]  or [Unrestricted]  or [Bypass]]

・[Restricted] に変更する(変更後に設定を確認)

PS C:\> Set-ExecutionPolicy Restricted

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
PS C:\>
PS C:\> Get-ExecutionPolicy
Restricted
PS C:\>

「-Force」オプションで確認を省略可能

実行ポリシー変更時に、変更することの確認をしたくない場合には「-Force」オプションで確認を省略することができます。

・[Unestricted] に強制的に変更する(変更後に設定を確認)

PS C:\> Set-ExecutionPolicy Unrestricted -Force
PS C:\>
PS C:\> Get-ExecutionPolicy
Unrestricted
PS C:\>

powershell起動時だけ一時的に実行ポリシーを変更する方法

「実行ポリシーは [Restricted] にしておきたいが、一時的に powershell を実行したいんだ」
ということもあるかと思います。

そういう場合には「Scope」で [Process] を指定して実行ポリシーを変更する方法がおすすめです。

これを実行すると、
今起動している powershell のインターフェース上でのみ実行ポリシーが変更される状態となり、
設定を元に戻す必要なく一時的に実行ポリシーが変更可能です。

・「Scope」に [Process] を指定して [Unrestricted] に変更する

Set-ExecutionPolicy Unrestricted -Scope Process -Force

実際にpowershellのインターフェースを別ウインドウでもう一つ開き、確認してみます。

Processを指定して変更した場合に別のインターフェースではどのように表示されるかを確認する

画像左側の [Process] の実行ポリシーを変更したインターフェースでは、
[Process] の欄に [Unrestricted] ポリシーが設定されていますが、

画像右側の別のウインドウで開いたインターフェースでは、
[Process] の欄に実行ポリシーが設定されていない状態([Undefined] となっている)ことが確認できるかと思います。

スコープごとの実行ポリシーを確認する方法

上記確認でも利用した Get-ExecutionPolicy -List はスコープごとの実行ポリシーを確認するときに利用します。

Get-ExecutionPolicy -List

以下のように出力されますので、上述の [Scope] 指定のポリシー変更方法とともに覚えておくとよいと思います。

PS C:\> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine      Restricted


PS C:\>
タイトルとURLをコピーしました