こんにちは。チェシャ男です。(-皿-)
今回は、
【実行ポリシーの変更(実行ユーザ編)】
について紹介します。
Set-ExecutionPolicy による実行ポリシーの変更でスクリプトファイルへ実行許可を与えることはできます。
しかし、全ユーザに恒久的な実行許可を与えることはセキュリティ的にリスクを伴うとも考えられます。
そこで、あなたが操作中のユーザのみ実行許可を与える限定的な実行ポリシーの変更方法をご紹介します。
同じく限定的な実行ポリシーの設定方法として、一時的な実行ポリシーの変更を行う方法はこちら↓の方法をが参考ください。
[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/sequrity/set-executionpolicy-process/”]
もくじ
実行ポリシーのスコープについて
スクリプトファイルの実行ポリシーを変更するコマンドレット
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
【エイリアス】
なし
PowerShell スクリプトを実行するには実行ポリシーが適切に設定されている必要があります。
また、実行ポリシーの設定は”-Scope”オプションでいくつかの「スコープ」つまり範囲を指定して設定ができるんです。
実行ポリシーを設定できるスコープのおさらい
Get-ExecutionPolicy コマンドレットに ”-List” オプションを付与することで、全スコープに対する実行ポリシーを取得できます。
PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine RemoteSigned
それぞれの Scope(スコープ)の意味は、
MachinePolicy -> マシングループポリシー
UserPolicy -> ユーザグループポリシー
Process -> 実行中の PowerShell プロセス内
CurrentUser -> 現在のユーザ
LocalMachine -> 全てのユーザ
の通りです。上の実行結果では、LocalMachine(全ユーザ)に ”RemoteSigned” が指定されています。
”RemoteSigned” であることから、このパソコンを操作するときは、
- ローカルで作成したスクリプト
- ネットワーク上またはインターネットから取得したスクリプト(署名付)
であれば、どんなスクリプトでも実行できてしまいます。
つまり、あなた以外のユーザであってもログインさえできてしまえばスクリプトを実行することができるという状態です。
現在のユーザだけ実行ポリシーを変更してみる
Windows マシンのセキュリティ保護のために導入されている実行ポリシーですが、スクリプトファイルを実行したいからと言ってむやみに変更するのは危険な場合があります。
単純に Set-ExecutionPolicy コマンドレットで実行ポリシーを変更してしまうと、LocalMachine(全ユーザ)に対して適応されます。
そこで、-Scope オプションを使用して適用範囲を制限してみましょう。
-Scope オプションに ”CurrentUser” を指定する
それでは、現在のユーザに対する実行ポリジ―の設定を行ってみます。以下のコマンドレットを実行してみましょう。
PS C:\> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
それぞれのオプションの意味は、
-Scope CurrentUser → 現在のユーザのみ対象
-ExecutionPolicy RemoteSigned → “RemoteSigned” ポリシーを適用
-Force → 強制的に実行
です。現在のユーザに対して設定しようとしていることがわかります。
では、本当に設定されているか確認してみましょう。
※設定変更がわかりやすいように、LocalMachine の実行ポリシーは “Restricted” に設定しておきます。
PS C:\> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser RemoteSigned LocalMachine Restricted
確かに、CurrentUser(現在のユーザ)だけ ”RemoteSigned” が設定されたことがわかります。
実行ポリシーの行方を追う
”CurrentUser” スコープを指定することで、無事実行ポリシーの変更ができました。
では、この時の実行ポリシー情報はどこ保存されているのでしょうか。
実行ポリシーを変更するでは、”LocalMachine” に対して実行ポリシーを設定した場合、
キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
データ:ExecutionPolicy
のレジストリに保存されていることがわかりました。
”HKEY_LOCAL_MACHINE\SOFTWARE” キーに保存されているところを見ると、現在のユーザに対しての場合は、”HKEY_CURRENT_USER” だろうと予想がつきますね。
実際に確認してみましょう。
キー:HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
データ:ExecutionPolicy
”Get-ItemPropertyValue” コマンドレットを使用し、”-Path” オプションに上記のキーを、”‐Name” オプションにデータを指定して下さい。
PS C:\> Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell -Name ExecutionPolicy RemoteSigned
”LocalMachine” の場合と同様、”CurrentUser” スコープに対して指定した場合も、レジストリに情報が保存されていることがわかりましたね。
別のユーザで実行ポリシーを確認した場合
”CurrentUser” スコープで現在のユーザに対してのみ実行ポリシーを変更できることがわかりました。
では、念のため他のユーザで実行ポリシーを確認して、実行ポリシーが設定されていないことを確認してみましょう。
適当にユーザを切り替えて(今回はtestuser)、確認してみます。
#実行ユーザの確認 PS C:\Users\testuser> Get-item Env:\USERNAME Name Value ---- ----- USERNAME testuser PS C:\Users\testuser> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine Restricted
”CurrentUser” が UnDefined(未定義)であることが確認できましたね。
まとめ
現在の実行ユーザに対して、実行ポリシーを設定する場合は、
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy <実行ポリシー>
で設定する。
設定できる実行ポリシーは、
- Restricted
- AllSigned
- RemoteSigned
- Unrestricted
- Bypass
- (Undefined)
このとき、設定の変更は別のユーザには反映されていない!