実行ポリシーについて
概要
PowerShellスクリプトを実行したらなんか実行が無効だってエラーが出たよ!それは実行ポリシーのせい。ありがたいけど、ちょっと面倒な実行ポリシーについてです。
> .\hoge.ps1
.\hoge.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\src\hoge.ps1
を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\hoge.ps1
+ ~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
実行ポリシーについて
スクリプトを実行する際の条件設定が以下の6種類存在する。デフォルトではRestrictedとなっているためスクリプトを実行することができない。誤操作防止的な理由ってことかな。
- Restricted: 構成ファイルの読み込みやスクリプトの実行を行いません。既定値は "Restricted" です。
- RemoteSigned: インターネットからダウンロードされたすべてのスクリプトおよび構成ファイルが、信頼された発行元によって署名されていることを要求します。
- Unrestricted: すべての構成ファイルを読み込み、すべてのスクリプトを実行します。インターネットからダウンロードされた署名されていないスクリプトを実行する場合、スクリプトを実行する前に確認を求められます。
- Bypass: 何もブロックされず、警告もメッセージも表示されません。
https://technet.microsoft.com/ja-JP/library/dd347628.aspx
- Undefined: 現在のスコープから現在割り当てられている実行ポリシーを削除します。このパラメーターは、グループ ポリシー スコープ内で設定された実行ポリシーは削除しません。
実行ポリシーの確認
現在の実行ポリシーを確認するには以下のコマンドレットを実行する。-Listパラメータを渡すと優先順で実行ポリシーの一覧が取得できるぞ。
> Get-ExecutionPolicy
Bypass
> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Bypass
CurrentUser RemoteSigned
LocalMachine Restricted実行ポリシーのスコープはProcessはメモリに、CurrentUserとLocalMachineはレジストリに格納される。また、グループポリシーでも設定することができる。
実行ポリシーの設定
実行ポリシーを変更したい場合は、管理者権限でPowerShellを起動しSet-ExecutionPolicyコマンドレットで変更することができる。ただ、ポリシー的に実行後に設定を戻しておいたほうがいいかも。
後でだと結構忘れちゃうんで-Scopeパラメータで特定のセッションに対してのみ変更をするほうがよさげ。これなら管理者権限でなくても変更できるし: )
> Set-ExecutionPolicy -Scope Process RemoteSigned -Force
PowerShell起動時に-ExecutionPolicyパラメータで指定してもOK。設定したポリシーは閉じるときに削除される。以下はコマンドプロンプトからスクリプトを実行する例。
CMD> PowerShell -ExecutionPolicy Bypass -file .\hello.ps1
実行ポリシーはひと手間かかるけど、間違えて.batファイルを実行して血の気が引く思いをするよりかはマシかも?