こんにちは。チェシャ男です。(-皿-)
今回は、
【PowerShell で一時的に実行ポリシーを変更】
について紹介します。
Set-ExecutionPolicy による恒久的な実行ポリシーの変更が不安な場合や、これまで実行ポリシーを一度も変更したことが無い PC 上でスクリプトを実行するにはどうしたらよいでしょうか?
そんな時は、一時的に実行ポリシーを変更してしまえばいいんです!
実行ポリシーの基本的な変更方法はこちら↓の記事をご参考ください。
もくじ
現在のプロセスのみ実行ポリシーを変更してみる
スクリプトファイルの実行ポリシーを変更するコマンドレット
Set-ExecutionPolicy
の使い方は以下をご覧ください。
[blogcard url=”https://cheshire-wara.com/powershell/ps-help/set-executionpolicy-help/”]【コマンドレット】
Set-ExecutionPolicy
【オプション】
-ExecutionPolicy <実行ポリシー>
-Scope <設定範囲のスコープ>
-Force
-WhatIf
-Confirm【入力】
Microsoft.PowerShell.ExecutionPolicy
Microsoft.PowerShell.ExecutionPolicyScope【出力】
System.Object
【エイリアス】
なし
実行ユーザの実行ポリシーを変更する方法の記事で ”CurrentUser” スコープで現在のユーザのみ実行ポリシーを変更する方法を紹介しました
しかし、この方法でも実行ポリシーを変更したユーザを悪用されると「悪意のあるスクリプトファイル」を実行されてしまうかもしれません。もっと「一時的」な実行許可を設定したい場合どうすればいいと思いますか?
もう一つの、”Process” スコープを確かめてみましょう。
”-Scope” オプションに ”Process” を指定する
以下のコマンドレットを実行してみましょう。
PS C:\> Set-ExecutionPolicy -Scope Process -ExecutionPolicy AllSigned -Force
それぞれのオプションの意味は、
-Scope Process → 現在のセッション(プロセス)が対象
-ExecutionPolicy Allsigned→ “Allsigned”ポリシーを適用
-Force → 強制的に実行
です。
現在のセッションとは、「今開いている PowerShell ウィンドウが閉じるまで」と思ってくだされば結構です。
では、実際に結果を確認してましょう。
PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process AllSigned CurrentUser RemoteSigned LocalMachine Restricted
確かに、”Process” の箇所が ”Allsigned” に変更されていますね。
実行ポリシーの行方を追う
”LocalMachine” や ”CurrentUser” スコープでは、実行ポリシ―の設定値がレジストリに保存されています。
では、今回はどこに情報が保存されているのでしょうか。試しにレジストリを覗いてみます。
PS C:\> Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell -Name ExecutionPolicy RemoteSigned PS C:\> Get-ItemPropertyValue -Path HKLM:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell -Name ExecutionPolicy Restricted
”Allsigned” は見当たりませんね。レジストリではないようです。”一時的”に値を保存するとすれば、環境変数あたりでしょうか。
ENV(環境変数)を “Get-childitem” コマンドレットで参照し、”Where-Object” コマンドレットで ”Allsigned” が格納されていないか確認してみましょう。
PS C:\> Get-ChildItem env: | Where-Object {$_.Value -eq "Allsigned" } Name Value ---- ----- PSExecutionPolicyPreference AllSigned
ヒットしましたね。どうやら ”Process” スコープでの実行ポリシーの設定値は、
環境変数「PSExecutionPolicyPreference」
に保存されているようです。
実行ポリシーの優先順位は?
さて、今回の内容では、
- Process
- CurrentUser
- LocalMachine
の3つのスコープに対して実行ポリシーが適用されています。
では3つのスコープすべてに実行ポリシーが設定されている場合は、どの実行ポリシーが適用されるのでしょうか。
まずは、現在の実行ポリシーを確認します。
PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process AllSigned CurrentUser RemoteSigned LocalMachine Restricted
- Process(現在のセッション) → AllSigned(署名付きのみ)
- CurrentUser(現在のユーザ) → RemoteSigned(リモートは署名付きのみ)
- LocalMachine(全ユーザ) → Restricted(すべて禁止)
が設定されています。では、Get-ExecutionPolicy で適用されている実行ポリシーを確認してみましょう。
PS C:\> Get-ExecutionPolicy AllSigned
実行結果を見てみると、”AllSigned” が適用されています。つまり、
Process(現在のセッション)
のスコープについての実行ポリシーが適用されていることが分かります。
このように、実行ポリシーは
Process > CurrentUser > LocalMachine
の順で、限定的な実行ポリシーが優先して適用されます。
今回はAD環境がないため、MachinePolicy や UserPolicy といったグループポリシーに関する実行ポリシーを含めた優先順位は検証できませんが、正確には
MachinePolicy > UserPolicy > Process > CurrentUser > LocalMachine
の順で適用されます。
スクリプト実行時のみ実行ポリシーを変更する
実行ポリシーの一時的な設定方法や優先順位はお分かりいただけましたか?
しかし、タスクスケジューラなどで、スクリプトを自動実行させたい場合はどうすればよいでしょうか。
実は、PowerShell の起動パラメータに ”-ExecutionPolicy” が存在するのです。
PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Allsigned CurrentUser RemoteSigned LocalMachine Restricted PS C:\> PowerShell.exe -ExecutionPolicy RemoteSigned Windows PowerShell Copyright (C) 2015 Microsoft Corporation. All rights reserved. PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process RemoteSigned CurrentUser RemoteSigned LocalMachine Restricted
ご覧のように、PowerShell 起動時に ”-ExecutionPolicy” を指定してあげることで、”Process” スコープの値が設定されます。
つまり、”-ExecutionPolicy” を使ったPowreshell 起動で応用すればスクリプト実行時のみ変更することが可能です。
下記の一行を記載したスクリプトを用意して実行してみましょう。
Write-Host -Object "I am Cheshire Boy"
“I am Cheshire Boy” と表示されれば成功ですね。
PS C:\> powershell.exe -ExecutionPolicy RemoteSigned -File .\test.ps1 I am Cheshire Boy PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process AllSigned CurrentUser RemoteSigned LocalMachine Restricted
スクリプトが ”RemoteSigned” によって無事に実行され、終了後は ”AllSigned” に戻っていることがわかります。
これで、自分の PC を危険に晒すことなく自作スクリプトが実行できるようになりましたね。
まとめ
一時的に実行ポリシーを変更する場合は、
Set-ExecutionPolicy -Scope Process -ExecutionPolicy <実行ポリシー>
特定のPowerShellプロセスに対して実行ポリシーを設定する場合は、
PowerShell.exe -ExecutionPolicy <実行ポリシー> -File <スクリプトファイル>
設定できる実行ポリシーは、
- Restricted
- AllSigned
- RemoteSigned
- Unrestricted
- Bypass
- (Undefined)