某PCショップ店員の覚書

勤務中に作成したプログラムやスクリプトのまとめ

Powershellで作成されたプログラムを動かそうとすると怒られる

Powershell Policyの状態を確認しよう

皆さんはPowershellを利用していますか?
Windowsに標準で備わっている機能であり、構文も難しくなくリファレンスも豊富で大変便利な代物です。
しかし、Powershellを勉強しようとした方が最初に躓くのがポリシー関連。
Powershell ISEでスクリプトを実行しようとしてもエラー、ps1を直接叩いてもエラー。

それもそのはず、Powershellは外部プログラムを呼び出して動作させたり、引数に暗号化した悪意たっぷりのコマンドを投げ、別のps1スクリプトで復号->実行
なんてこともできてしまいます。
そうならないために初期状態のPowershellはポリシーがガッチガチです。
試しにPowershellで下記のコマンドを実行してみてください。

Get-ExecutionPolicy -List

Powershellを初めて利用するPCではほとんどがRestrictedになってるかと思われます。
これ、個別のコマンド(Powershellのプロンプト上から1個1個コマンドを入力すること)は許可しますが、ps1などのスクリプトは許可しない設定のことです。
そしてRestricted以外にも複数の状態があります。

Policyの状態

状態 説明
Restricted
スクリプトは全て実行不可
AllSigned
署名付きスクリプトのみ実行可能
RemoteSigned
ローカルのスクリプトと署名付きのリモートスクリプトのみ実行可能
Bypass
何もブロックせず、警告もプロンプトも表示しないで実行
Unrestricted
全て実行可能
Undefined
未定義(Restrictedのポリシーが適応される)

つまり、初期状態だとスクリプトの実行は全て弾かれるんです。

ポリシーを変更しよう

では、これからPowershellでプログラミングを勉強する方のためにもポリシーを変更しましょう。
下記のコマンドを実行予定のスクリプトかプロンプトに入力してください。

Set-ExecutionPolicy RemoteSigned -Scope Process -Force

これでスクリプトの実行が許可されるようになりました。
でもなんだか見慣れない引数がありますね。
ご安心ください。説明します。

最初に

Get-ExecutionPolicy -List

を実行してもらったときに表のような形で出力されたかと思います。

Scope ExecutionPolicy
MachinePolicy
UnDefined
UserPolicy
Undefined
Process
Undefined
CurrentUser
AllSigned
LocalMachine
RemoteSigned

それぞれの意味も説明します。

Scope(有効範囲)の説明

MachinePolicy
グループポリシーでそのコンピュータの全ユーザーに強制
UserPolicy
現在のユーザーに強制
Process
現在のセッションに対して適応
CurrentUser
現在のユーザーに対して適応
LocalMachine
コンピュータの全ユーザーに対して適応

つまり、先ほどのコマンドは
ローカルでのスクリプトの実行を許可する 有効範囲はスクリプトが終了するまで
という意味になります。
でもこれ、毎回スクリプトに記載するかプロンプトに入力しなければなりません。
正直面倒くさい。
ってことでPolicyのScopeを変更しましょう。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

これで毎回入力する手間が省けます。
ただし、怪しいスクリプトをDLして実行してしまう危険性もありますのでご注意を。

最後に注意とスコープのオススメ設定

なお、Scopeパラメータを指定しないでポリシー変更コマンドを実行するとLocalMachineの実行ポリシーを変更することになり、管理者として実行していない場合はエラーになります。
また、グループポリシーによって優先度の高いMachinePolicyやUserPolicyスコープがRestrictedに設定されている場合は管理者権限で頑張ってもスクリプトを実行することができません。※batやvbsからスクリプトブロックとして実行することは可能

私個人の考えですが、どれだけ対策していてもウイルスに感染する可能性を0%にすることは不可能なので、少しでもリスクを避けるのであればセキュリティ重視の

Set-ExecutionPolicy RemoteSigned -Scope Process -Force

にすることをオススメします。