Powershellの実行ポリシー
- kita56
- 2024年3月4日
- 読了時間: 3分
Powershellのスクリプトで困ったことがあったので、紹介します。
発生した問題
Powershellのスクリプトが開発時は問題なく動作していましたが、検証環境でテストを始めるとエラーとなり実行できなくなりました。
原因
開発環境の実行ポリシーは「RemoteSigned(ローカルのスクリプトは実行できますが、リモートからダウンロードしたスクリプは信頼する署名を持つもののみ実行できる)」が設定されていました。
実行ポリシーが「RemoteSigned」の場合、ローカルのファイルは実行可能なので、問題なく実行できていました。
実行ポリシーに意識が向いておらず、検証環境でも開発環境と同じように実行できると思い込んでいました。
検証環境の実行ポリシーには「Restrict(スクリプトの実行はできない)」が設定されていたので、Powershellの実行ポリシーにより、スクリプトの実行がブロックされました。
Powershellの実行ポリシー
Powershellの実行ポリシーには下記の5つがあります。
実行ポリシー | ローカル | リモート |
Restrict | × | × |
Allsigned | 署名付きのみ〇 | 署名付きのみ〇 |
RemoteSigned | 〇 | 署名付きのみ〇 |
UnRestrict | 〇 | 〇(警告あり) |
ByPass | 〇 | 〇 |
実行環境の設定変更による実行ポリシーの変更
Powershellのデフォルトの環境の実行ポリシーは、クライアントOSでは「Restrict」、サーバーOSでは「RemoteSigned」が設定されています。
検証環境では「Restrict」が設定されていました。
管理者権限を持っていれば、Set-ExecutionPolicyコマンドレットで実行ポリシーを変更することができます。
起動オプションによる実行ポリシーの変更
管理者権限を持っていなくても、起動オプション"-ExecutionPolicy"で一時的に実行ポリシーを指定して実行することができます。
Unblock-Fileコマンドレットによるブロック解除
管理者権限を持っていなくても、Unblock-Fileコマンドレットで、リモートからダウンロードしたファイルのブロックを解除することができます。
Powershell 3.0以降で使用可能です。
解決策1
起動オプションに"-ExecutionPolicy ByPass"を追加する
解決策2
Unblock-Fileコマンドレットでダウンロードしたスクリプトのブロックを解除する
起動オプションに"-ExecutionPolicy RemoteSigned"を追加する
まとめ
Powershellのスクリプトが開発時は問題なく動作していましたが、検証環境でテストを始めるとエラーとなり実行できなくなりました。
Powershellのスクリプトは、実行ポリシーにより実行の可否が制御されており、使用する際は適切な実行ポリシーを設定する必要があります。
Powershellの実行ポリシーは環境の設定を変更することも可能ですが、起動オプションによる変更の方が、スクリプトの実行後に元の実行ポリシーに戻るため、セキュリティリスクを最小限に抑えることができ、安全です。
解決策1は起動オプションを指定するだけでお手軽ですが、その実行中にすべてのスクリプトの実行が許可されてしまうため、セキュリティリスクがやや高くなります。
解決策2は誤ってリモートからダウンロードしたスクリプトを起動してしまっても実行できないので、セキュリティリスクが低く、お勧めです。
【補足】ローカルで作成したスクリプトを頻繁にテストする開発環境では、実行ポリシーを「RemoteSigned」にすることで、セキュリティと利便性のバランスをとることも選択肢になると思います。
Comments