PowerShellスクリプトの実行ポリシーを変更する方法|Set-ExecutionPolicyとエラー解決

当ページのリンクには広告が含まれています。
PowerShellの実行ポリシーエラーの原因と対処方法を初心者にもわかりやすく解説し、安全にスクリプトを実行する手順を紹介する記事

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

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

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

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

目次

この記事でわかること

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

PowerShellの実行ポリシーとは?

なぜスクリプトの実行が制限されているのか

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

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

「ps1ファイルを実行したい」という場面でこの制限に引っかかるわけです。

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

参考:実行ポリシーについて – PowerShell | Microsoft Learn

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

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

ポリシー名動作概要
Restrictedすべてのスクリプトの実行をブロック。PowerShellのデフォルト設定。
AllSigned信頼された発行元によって署名されたスクリプトのみ実行可能(ローカルスクリプトも署名必須)。
RemoteSignedローカルスクリプトは実行可能。インターネットから取得したスクリプトは署名が必要。
Unrestrictedすべてのスクリプトを実行可能。ただしインターネット由来のスクリプトには警告が表示される。
Bypass制限なし・警告なしでスクリプトを実行可能。主に自動化やCI/CD用途。セキュリティリスクが高いため通常利用では非推奨。
Undefinedポリシー未設定。上位スコープ(Machine/Userなど)の設定が適用される。

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

実行ポリシー比較

重要なポリシーのRestricted / RemoteSigned / Unrestrictedの違いをより詳しくまとめると下記のとおりです。

項目RestrictedRemoteSignedUnrestricted
スクリプト実行❌ 不可⭕ 可⭕ 可
ローカルスクリプト❌ 実行不可⭕ 実行可⭕ 実行可
ダウンロードスクリプト❌ 実行不可⭕ 署名が必要⭕ 実行可(警告あり)
セキュリティレベル🔒 最も高い🔒 中⚠️ 低
初心者おすすめ度△(厳しすぎる)◎(最もバランス良い)△(リスクあり)
主な用途制限された環境開発・通常利用テスト・検証

迷ったらセキュリティと利便性のバランスが良くMicrosoftも一般用途で推奨寄りRemoteSignedを選ぶのが良いと思います。

実行ポリシーのセキュリティリスク

PowerShellの実行ポリシーはセキュリティ機能の一部ですが完全な防御ではありません
設定によっては悪意のあるスクリプトが実行されるリスクがあります。

なぜ危険なのか

  • スクリプトはファイル操作・レジストリ操作・ネットワーク通信が可能。
  • マルウェアがPowerShellを利用するケースがある。
  • 実行ポリシーはユーザーの誤操作で簡単に変更できる

特に注意すべきポリシー

  • Bypass
     → 制限も警告もなし(最も危険)
  • Unrestricted
     → 実行できてしまう(警告だけでは防げない)

よくあるリスクパターン

  • ネットからDLしたスクリプトをそのまま実行する。
  • 実行ポリシーを一時的に緩めて戻し忘れる。
  • 意味を理解せずSet-ExecutionPolicyを実行。

実行ポリシーは“セキュリティ機能ではない”

PowerShellの実行ポリシーは、厳密にはセキュリティ機能ではなくユーザーの誤操作を防ぐための安全装置です。

そのため、以下のような特徴があります。

  • 強制力は弱い(回避可能)
  • 管理者権限があれば変更できる
  • マルウェア対策としては不十分

つまり実行ポリシーだけで安全になるわけではないです。

実行ポリシーの変更は用途に応じて方法を使い分けることが重要です

  • 検証環境
    →Processスコープで一時的に変更する。(PowerShell終了で自動的に元に戻る)
  • CI/CDや自動化
    →実行時オプションでBypassを指定して実行する。(設定自体は変更しない)

このように「設定を変更する」のではなく影響範囲を限定することが重要です。

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

Get-ExecutionPolicyの使い方

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

PowerShell
Get-ExecutionPolicy

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

PowerShell – 実行結果
Restricted

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

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

実行ポリシーにはスコープ(適用範囲)という概念があります。スコープごとに異なるポリシーを設定でき、優先度の高いスコープが優先して適用されます。

-Listオプションを使うと全スコープの設定を一覧で確認できます。

PowerShell
Get-ExecutionPolicy -List
PowerShell – 実行結果
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       Restricted

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

なおMachinePolicyUserPolicyはグループポリシーから設定されるスコープです。ここに値が入っている場合、個人での変更は上書きされてしまいます。業務PCで変更が反映されないときは要チェックです。

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

Set-ExecutionPolicyの基本的な使い方

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

PowerShell – 書式
Set-ExecutionPolicy <ポリシー名> -Scope <スコープ>

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

PowerShell – 書式
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

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

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

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

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

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

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

PowerShell – 実行結果(権限エラー)
Set-ExecutionPolicy: Access to the path 'C:\Program Files\PowerShell\7\powershell.config.json' is denied.
To change the execution policy for the default (LocalMachine) scope, start PowerShell with the "Run as administrator" option.
To change the execution policy for the current user, run "Set-ExecutionPolicy -Scope CurrentUser".

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

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

なお、PowerShellをどのフォルダーで開くか迷ったときは以下の記事も参考にしてみてください。作業対象フォルダーで直接起動する3つの方法を紹介しています。

よくあるエラーと対処法

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

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

Step
現在の設定を確認する
PowerShell
Get-ExecutionPolicy -List
PowerShell – 実行結果
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Restricted
Step
CurrentUserスコープでRemoteSignedに変更する
PowerShell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Step
変更後に再確認する
PowerShell
Get-ExecutionPolicy
PowerShell – 実行結果
RemoteSigned

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

これでPowerShellの実行ポリシーによるエラーは解決できます。実務ではここからスクリプトを活用していくことが重要です。PowerShellを使った自動化や定期実行については以下の記事で詳しく解説しています。

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

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

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

現在使っているPowerShellのバージョンは以下のコマンドで確認できます。

PowerShell
$PSVersionTable
コマンド – 実行結果(例)
Name                           Value
----                           -----
PSVersion                      7.4.2
PSEdition                      Core
...

PSVersion5.xであればWindows PowerShell、7.xであればPowerShell 7です。両方インストールしている場合はそれぞれで実行ポリシーを設定する必要があります。

PowerShellはパッケージ管理にも活用できます。Windowsでソフトを一括インストールする方法はこちら。

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

個人PCの場合

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

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

業務・共有PCの場合

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

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

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

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

Q&A

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

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

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

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

Bypass と Unrestricted の違いは?

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

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

元に戻すや直接初期化するのような設定動作はありませんが、Windowsのデフォルト値であるRestrictedを指定するのが実質的には元に戻すことになると思います。

PowerShell
Set-ExecutionPolicy Restricted -Scope CurrentUser

スクリプトや処理の効率化という観点ではJavaのStream APIも参考になります。

まとめ

  • 実行ポリシーはPowerShellのスクリプト実行を制御するセキュリティの仕組みだよ。
  • 「スクリプトの実行が無効になっているため~」エラーはSet-ExecutionPolicy RemoteSigned -Scope CurrentUserで解決できることが多いよ。
  • スコープはCurrentUser(自分だけ)とLocalMachine(PC全体)で使い分けてね。
  • 業務PCや共有PCはProcessスコープで一時的に対応するのが安全だよ。
  • 変更が反映されない場合はグループポリシーやPowerShellのバージョン違いを疑ってみてね。

実行ポリシーを理解したら、次はPowerShell全体の使い方を広げてみませんか。コマンド一覧や実践的な活用例をまとめた記事もあわせてどうぞ。

次にやること

PowerShellの実行ポリシーを理解できたら次は実際に活用していくのがおすすめです。

PowerShellで自動化したい

定期実行ツールの違いを詳しく見る

ソフト管理を効率化したい

wingetの使い方を詳しく見る

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次