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
にすることをオススメします。