【Set-ExecutionPolicy】PowerShellで実行ポリシーを「一時的」に変更するテクニック

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShell で一時的に実行ポリシーを変更

について紹介します。

Set-ExecutionPolicy による恒久的な実行ポリシーの変更が不安な場合や、これまで実行ポリシーを一度も変更したことが無い PC 上でスクリプトを実行するにはどうしたらよいでしょうか?

そんな時は、一時的に実行ポリシーを変更してしまえばいいんです!

実行ポリシーの基本的な変更方法はこちら↓の記事をご参考ください。

【Set-ExecutionPolicy】PowerShellで実行ポリシーを変更する方法

 

現在のプロセスのみ実行ポリシーを変更してみる

スクリプトファイルの実行ポリシーを変更するコマンドレット

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)

コメントを残す

メールアドレスが公開されることはありません。