cheshire-boy

セキュリティ

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

投稿日:2016年10月17日 更新日:

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

今回は、

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

について紹介します。

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

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

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

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

 

スポンサーリンク

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

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

Set-ExecutionPolicy

の使い方は以下をご覧ください。

【コマンドレット】

Set-ExecutionPolicy

【オプション】

-ExecutionPolicy <実行ポリシー>
-Scope     <設定範囲のスコープ>
-Force
-WhatIf
-Confirm

【入力】

Microsoft.PowerShell.ExecutionPolicy
Microsoft.PowerShell.ExecutionPolicyScope

【出力】

System.Object

【エイリアス】

なし

実行ユーザの実行ポリシーを変更する方法の記事で ”CurrentUser” スコープで現在のユーザのみ実行ポリシーを変更する方法を紹介しました

しかし、この方法でも実行ポリシーを変更したユーザを悪用されると「悪意のあるスクリプトファイル」を実行されてしまうかもしれません。もっと「一時的な実行許可を設定したい場合どうすればいいと思いますか?

もう一つの、"Process" スコープを確かめてみましょう。

”-Scope” オプションに ”Process” を指定する

以下のコマンドレットを実行してみましょう。

それぞれのオプションの意味は、

-Scope Process → 現在のセッション(プロセス)が対象

-ExecutionPolicy Allsigned→ "Allsigned"ポリシーを適用

-Force → 強制的に実行

です。

現在のセッションとは、「今開いている PowerShell ウィンドウが閉じるまで」と思ってくだされば結構です。

では、実際に結果を確認してましょう。

確かに、”Process” の箇所が ”Allsigned” に変更されていますね。

実行ポリシーの行方を追う

LocalMachine” や ”CurrentUser” スコープでは、実行ポリシ―の設定値がレジストリに保存されています。

では、今回はどこに情報が保存されているのでしょうか。試しにレジストリを覗いてみます。

Allsigned” は見当たりませんね。レジストリではないようです。”一時的”に値を保存するとすれば、環境変数あたりでしょうか。

ENV(環境変数)を "Get-childitem" コマンドレットで参照し、”Where-Object” コマンドレットで ”Allsigned” が格納されていないか確認してみましょう。

ヒットしましたね。どうやら ”Process” スコープでの実行ポリシーの設定値は、

環境変数「PSExecutionPolicyPreference

に保存されているようです。

実行ポリシーの優先順位は?

さて、今回の内容では、

  • Process
  • CurrentUser
  • LocalMachine

の3つのスコープに対して実行ポリシーが適用されています。

では3つのスコープすべてに実行ポリシーが設定されている場合は、どの実行ポリシーが適用されるのでしょうか。

まずは、現在の実行ポリシーを確認します。

  • Process(現在のセッション) → AllSigned(署名付きのみ)
  • CurrentUser(現在のユーザ) → RemoteSigned(リモートは署名付きのみ)
  • LocalMachine(全ユーザ) → Restricted(すべて禁止)

が設定されています。では、Get-ExecutionPolicy で適用されている実行ポリシーを確認してみましょう。

実行結果を見てみると、”AllSigned” が適用されています。つまり、

Process(現在のセッション)

のスコープについての実行ポリシーが適用されていることが分かります。

このように、実行ポリシーは

Process > CurrentUser > LocalMachine

の順で、限定的な実行ポリシーが優先して適用されます。

今回はAD環境がないため、MachinePolicy UserPolicy といったグループポリシーに関する実行ポリシーを含めた優先順位は検証できませんが、正確には

MachinePolicy > UserPolicy > Process > CurrentUser > LocalMachine

の順で適用されます。

スクリプト実行時のみ実行ポリシーを変更する

実行ポリシーの一時的な設定方法や優先順位はお分かりいただけましたか?

しかし、タスクスケジューラなどで、スクリプトを自動実行させたい場合はどうすればよいでしょうか。

実は、PowerShell の起動パラメータに ”-ExecutionPolicy” が存在するのです。

ご覧のように、PowerShell 起動時に ”-ExecutionPolicy” を指定してあげることで、”Process” スコープの値が設定されます。

つまり、”-ExecutionPolicy” を使ったPowreshell 起動で応用すればスクリプト実行時のみ変更することが可能です。

下記の一行を記載したスクリプトを用意して実行してみましょう。

"I am Cheshire Boy" と表示されれば成功ですね。

スクリプトが ”RemoteSigned” によって無事に実行され、終了後は ”AllSigned” に戻っていることがわかります。

これで、自分の PC を危険に晒すことなく自作スクリプトが実行できるようになりましたね。

まとめ

一時的に実行ポリシーを変更する場合は、

Set-ExecutionPolicy -Scope Process -ExecutionPolicy <実行ポリシー>

特定のPowerShellプロセスに対して実行ポリシーを設定する場合は、

PowerShell.exe -ExecutionPolicy <実行ポリシー> -File <スクリプトファイル>

設定できる実行ポリシーは、

  • Restricted
  • AllSigned
  • RemoteSigned
  • Unrestricted
  • Bypass
  • (Undefined)
スポンサーリンク

-セキュリティ
-, , ,

Copyright© 【チェシャわら】PowerShellとは、から学ぶ入門者の教科書-脱コマンドプロンプト- , 2017 AllRights Reserved Powered by micata2.