本記事にはアフィリエイトリンクを含みます。Amazonのアソシエイトとして収益を得る場合があります。

PowerShellの実行ポリシー完全ガイド|Set-ExecutionPolicyの使い方と安全な設定

PowerShellのアイキャッチ PowerShell
PowerShell

PowerShellでスクリプトを実行しようとしたらこんなエラーが出て止まってしまったこと、ないです?

このシステムではスクリプトの実行が無効になっているため、ファイル〇〇.ps1 を読み込むことができません。

「え、なんで動かないの……」となるやつですよね。 実はこれ、PowerShellの実行ポリシーという仕組みが原因です。

初めて見ると少し面食らいますが、仕組みを理解してしまえばサクッと解決できます。この記事ではエラーの原因から安全な設定方法までまとめて解説します。

この記事でわかること

  • 実行ポリシーとは何か、なぜ制限されているのか。
  • Restricted / RemoteSigned / Unrestricted など各ポリシーの違い。
  • 現在の設定を確認するコマンドの使い方。
  • Set-ExecutionPolicy でポリシーを変更する方法。
  • スコープ(CurrentUser / LocalMachine)の使い分け。
  • 「スクリプトの実行が無効になっているため~」エラーの解決方法。
  • 個人PC・業務PCそれぞれの推奨設定。

PowerShellの実行ポリシーとは?

なぜ実行が制限されているのか

実行ポリシーとはPowerShellがスクリプト(.ps1ファイル)を実行する際のルールを定める仕組みです。

Windowsではデフォルトでスクリプトの実行が制限されています。 これは悪意のあるスクリプトが意図せず実行されてしまうのを防ぐためのセキュリティ上の配慮です。

「スクリプトを実行したい」という場面でこの制限に引っかかるわけですね。

補足 実行ポリシーはあくまでも「うっかり実行してしまう」のを防ぐ仕組みです。 悪意のある攻撃者を完全に防ぐセキュリティ機能ではない点はMicrosoft公式でも明記されています。
参考:実行ポリシーについて – PowerShell | Microsoft Learn

実行ポリシーの種類と意味

ポリシーには以下の種類があります。

ポリシー名動作概要
Restrictedすべてのスクリプトの実行をブロック。Windowsのデフォルト。
AllSigned信頼された発行元によってデジタル署名されたスクリプトのみ実行可。
RemoteSignedローカルで作成したスクリプトはそのまま実行可。インターネットからダウンロードしたスクリプトは署名が必要。
Unrestrictedすべてのスクリプトを実行可。ただしインターネット由来のスクリプトは実行前に警告が出る。
Bypass制限なし、警告なし。主にCI/CDなどの自動化環境向け。
Undefined現在のスコープでポリシーが未設定。上位スコープの設定が適用される。

日常的な用途では RemoteSigned が使い勝手とセキュリティのバランスがよく、推奨されることが多いです。

現在の実行ポリシーを確認する方法

Get-ExecutionPolicy コマンドの使い方

現在の実行ポリシーはGet-ExecutionPolicyで確認できます。

PowerShell

実行すると現在のポリシー名が1行で返ってきます。

PowerShell – 実行結果

この場合はスクリプトの実行がブロックされている状態です。

スコープ別に確認する方法

実行ポリシーにはスコープ(適用範囲)という概念があります。どのスコープにどのポリシーが設定されているかを一覧で確認したいときは-Listオプションで行えます。

PowerShell
PowerShell – 実行結果

上から順に優先度が高く、最初に値が設定されているスコープのポリシーが適用されます。この例ではCurrentUserRemoteSignedが設定されているため、現在の実行ポリシーはRemoteSignedと判断できるわけですね。

実行ポリシーを変更する方法

Set-ExecutionPolicy の基本的な使い方

ポリシーを変更するにはSet-ExecutionPolicyを使います。

構文

例:CurrentUserをRemoteSignedに変更する場合

PowerShell

スコープ(CurrentUser / LocalMachine)の違いと使い分け

-Scopeオプションでどの範囲にポリシーを適用するかを指定できます。-Scopeを省略した場合はLocalMachine扱いになります。

スコープ名適用範囲管理者権限
LocalMachineそのPCにログインするすべてのユーザー必要
CurrentUser現在ログインしているユーザーのみ不要
Process現在起動中のPowerShellセッションのみ不要

自分のPC環境でスクリプトを動かしたいだけならCurrentUserでよいと思います。

管理者権限が必要なケースとは

LocalMachineスコープへの変更は管理者権限が必要です。一般ユーザーで実行すると以下のエラーが出ます。

PowerShell

この場合はPowerShellを管理者として実行してから再度コマンドを試してみてください。

⚠️ 注意 LocalMachineの設定はPC全体に影響します。業務環境では変更前にIT管理者への確認をおすすめします。

よくあるエラーと対処法

「このシステムではスクリプトの実行が無効になっているため~」

このエラーは実行ポリシーがRestrictedになっているときに発生します。自分のPC環境であれば、以下のコマンドで解決できます。

  • Step1
    現在の設定を確認する
    PowerShell
    PowerShell – 実行結果
  • Step2
    CurrentUser スコープで RemoteSigned に変更する
    PowerShell
  • Step3
    変更後に再確認する
    PowerShell

    RemoteSignedと表示されれば設定完了です。スクリプトを再実行してみてください。

変更しても反映されない場合

設定を変更したはずなのに反映されないことがあります。よくある原因は以下のとおりです。

  • グループポリシーで上書きされている
    MachinePolicyUserPolicyスコープに管理者が設定を入れていると、個人設定より優先されます。社用PCでは特に多いパターンです。
  • スコープが噛み合っていない
    LocalMachineを変えたつもりがCurrentUser側が優先されているケースもあります。Get-ExecutionPolicy -Listで全スコープを確認してみてください。
  • PowerShellのバージョンが異なる
    Windows PowerShell(5.1)とPowerShell 7系は別々の設定を持ちます。どちらで設定・実行しているか確認してみてください。

セキュリティ的に安全な推奨設定

個人PCの場合

自宅など自分だけが使うPCであれば、以下の設定が使いやすいです。

PowerShell
  • ローカルで自作したスクリプトはそのまま実行できます。
  • ネットからダウンロードしたスクリプトには署名チェックが入るので、最低限の安全性は保てます。
  • 管理者権限なしで設定できるのも手軽なポイントです。

業務・共有PCの場合

複数人が使うPC、または会社のPCではなるべくポリシーを変更しないことが基本です。

どうしても変更が必要な場合は以下のような対応が現実的です。

  • 実行するセッションだけに一時的に適用するProcessスコープを使う。
PowerShell
  • スクリプトに署名を付与してAllSignedポリシーに対応させる。
  • IT管理者に相談してグループポリシーを確認してもらう。

UnrestrictedBypassLocalMachineに設定するのはセキュリティリスクが上がるためおすすめしません。

Q&A

Q
Set-ExecutionPolicy を実行したら「レジストリへの書き込みに失敗しました」と出ました。
A

管理者権限が必要なスコープ(LocalMachine)に書き込もうとしている可能性があります。-Scope CurrentUserを付けてみてください。

Q
PowerShell 7とWindows PowerShellで設定は共有される?
A

共有されません。それぞれ独立した設定を持っています。 両方で使う場合は両方で設定を確認してみてください。

Q
Bypass と Unrestricted の違いは?
A

どちらもすべてのスクリプトを実行できますがUnrestrictedはインターネット由来のスクリプト実行時に警告が出ます。Bypassは警告もブロックもなしです。CI/CD環境などの自動化では Bypass -Scope Processがよく使われます。

Q
設定を元に戻したいときはどうすればいい?
A

設定を元に戻すという指定はできないので、デフォルト値であるRestrictedを指定する形になると思います。

まとめ

  • 実行ポリシーはPowerShellのスクリプト実行を制御するセキュリティの仕組みだよ。
  • 「スクリプトの実行が無効になっているため~」エラーはSet-ExecutionPolicy RemoteSigned -Scope CurrentUserで解決できることが多いよ。
  • スコープはCurrentUser(自分だけ)とLocalMachine(PC全体)で使い分けてね。
  • 業務PCや共有PCはProcessスコープで一時的に対応するのが安全だよ。
  • 変更が反映されない場合はグループポリシーやPowerShellのバージョン違いを疑ってみてね。
当ブログの内容はできる限り正確な情報を提供するよう努めていますが、利用にあたっては自己責任でお願いいたします。
掲載内容に基づく操作・設定などによって生じたトラブルや損害について、当サイトは一切の責任を負いません。
タイトルとURLをコピーしました