PowerShellのスクリプトが実行できない

2020-12-08 | コメント(0)

PowerShellのスクリプトを実行する時に、
ファイル ****.ps1 を読み込めません。ファイル ****.ps1 はデジタル署名されていません。
など表示されて実行できないことがあります。

PowerShell ISE でも、F5で実行するときに同じく実行できないことがあります。

初期状態の新しいPCや、間借りしたPCなどで良く発生するので、エントリーとして残します。

このエラーが発生するのは、PowerShellの実行ポリシーが許可されていないのが原因です。

PowerShellの実行ポリシーを許可するには、次のコマンドで許可しましょう。

一般ユーザーの場合

自分自身の実行ポリシーを許可します。 通常、ほとんどの場合でこの方法で解決できます。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

管理者として、すべてのユーザーの実行ポリシーを許可する場合

すべてのユーザーを許可するため、この設定はセキュリティ的にお勧めしません。

ユーザーを特定せずに、PC上のすべてのユーザーの実行ポリシーを許可するには、Scope オプション を付けずに実行します。

Scope オプション を付けない場合、実行するには管理者権限が必要です。

Set-ExecutionPolicy RemoteSigned

実行ポリシーの詳細

PowerShellのスクリプトは .ps1 拡張子で、デフォルトの状態では、このスクリプトファイルは実行できない様になっています。

例えば、PowerShellでは無いコマンドテキストでは、.bat や .cmd 拡張子のバッチファイルとして、エクスプローラーなどからダブルクリックして実行することが出来ます。簡単に実行することができるため、不意に実行してしまい、事故を起こしてしまったという経験をした人も多いと思います。

また、簡単に実行できるということは、何かのウイルスに感染する時や感染した後も簡単に実行されてしまうということから、ウイルス感染の入口になることも多いです。

これらのセキュリティのため、PowerShellのデフォルトでは、実行できない様になっています。

実際にスクリプトを組んで、実行、テストをする場合には、スクリプトが実行できるように設定しておく必要がありますが、PC上のすべてのユーザーに実行を許可する必要は無いと思います。必要なユーザーだけが実行できれば良いと思いますので、できるだけ実行ユーザー自身で -Scope CurrentUser を付けて実行ポリシーを設定するのが良いと思います。

実行ポリシーの詳細は、次の Microsoft Docs も参照してください。
Set-ExecutionPolicy 説明サイト

具体的な実行ポリシーは、制限の強い順に次の値があります。

  • Undefined
  • Restricted
  • AllSigned
  • RemoteSigned
  • Unrestricted
  • Bypass

ローカルファイルの .ps1 ファイルを実行するには、RemoteSigned (以上) が必要になるので RemoteSigned を指定しておけば良いです。

次に スコープ ですが、対象として次の指定ができます。

  • LocalMachine
  • CurrentUser
  • Process

グループポリシーとして、スコープの設定もできます。

  • MachinePolicy
  • UserPolicy

Set-ExecutionPolicy で、スコープを指定しない場合は、デフォルトとして LocalMachine のスコープになります。

スコープの指定が、LocalMachine か CurrentUser の場合、実行ポリシーの設定値はレジストリに格納されることになり、この時のレジストリの格納先は、LocalMachine の場合は HKLM、CurrentUser の場合は HKCU になるため、スコープを指定しない場合 (つまり LocalMachine 指定)、レジストリの HKLM の書き込みのために管理者権限が必要になります。

実際に、実行ポリシーは自分自身の制限緩和のために設定するほうが良いので、-Scope CurrentUser を指定するほうが良く、管理者権限が無くても設定できます。

実行ポリシー設定用のバッチファイル

下記のテキストファイルを、〇〇〇.batファイルとして、バッチファイルを用意できます。

@echo off
setlocal

for /f "usebackq" %%r in (`powershell -command "Get-ExecutionPolicy -Scope CurrentUser"`) do set PSPolicy=%%r

if %PSPolicy%=="RemoteSigned" goto done

powershell -command "Set-ExecutionPolicy RemoteSigned -Scope CurrentUser"

:done

Get-ExecutionPolicy で 現在の実行ポリシーを確認し、RemoteSigned が設定されていなければ、RemoteSigned にするというものです。

カテゴリ:

コメントする

※HTMLタグは使えません

Author

あきちゃん

主に、.NETでWebシステムの設計と開発をしています。
(茨城県在住, 都内勤務)
プロフィール