状況
夜遅く、デプロイスクリプトを実行しようとしたり、Python仮想環境を有効化しようとしたり、チームメイトから送られてきたセットアップスクリプトを起動しようとしています。コマンドを入力してEnterを押すと、進行状況の代わりに以下のエラーが表示されます:
File C:\scripts\deploy.ps1 cannot be loaded because running scripts is disabled on this system.
For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.
スクリプトは実行されませんでした。何もデプロイされませんでした。同僚のマシンは問題なく動作しているのに、あなたのマシンはまったく動きません。
PowerShellの実行ポリシーがブロックしています。これはどのスクリプトの実行を許可するかを制御するセキュリティ機能で、Windowsはデフォルトでロックされています。5分後には解決できます。
何が起きているかを理解する(30秒)
PowerShellには、ここで重要な4つの実行ポリシーレベルがあります:
- Restricted — スクリプトはまったく実行されません。Windowsクライアントエディション(Windows 10/11)のデフォルト設定です。
- AllSigned — 信頼された発行者によって署名されたスクリプトのみ実行されます。
- RemoteSigned — ローカルスクリプトは自由に実行されます。ダウンロードされたスクリプトには署名が必要です。
- Unrestricted — すべてのスクリプトが実行されますが、ダウンロードされたものはプロンプトが表示されます。
ほとんどの場合、このエラーはポリシーがRestrictedに設定されていることを意味します。
まず現在のポリシーを確認する
PowerShell(CMDではない)を開いて実行します:
Get-ExecutionPolicy -List
次のような出力が表示されます:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Restricted
最も具体的なスコープが優先されます。LocalMachineがRestrictedを示し、他に何も設定されていない場合、それが原因です。
注意点として、MachinePolicyまたはUserPolicyに値が表示されている場合、それはグループポリシーによるものです。管理者権限またはGPOの変更なしにはオーバーライドできません。その場合は解決策3に進んでください。
解決策1:現在のユーザーの実行ポリシーを設定する(推奨)
まずここから始めましょう。これはあなたのユーザーアカウントにのみ影響し、UACプロンプトが不要で、管理者権限なしでほとんどのマシンで機能します。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
RemoteSignedは適切なバランスを取っています。自分のスクリプトは自由に実行でき、ダウンロードしたものには署名が必要です。この署名要件が実際のマルウェアを捕捉するため、使用してもセキュリティホールを開くことにはなりません。
解決策2:マシン全体に設定する(管理者権限が必要)
開発者ワークステーションやCI/CDランナーのセットアップで、すべてのユーザーがスクリプトにアクセスできるようにする必要がある場合は、PowerShellを管理者として実行してから:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
PowerShellが確認を求めます。Yを入力してEnterを押してください。マシン上のすべてのユーザーがスクリプトを実行できるようになります。
解決策3:単一セッションでバイパスする(管理者不要、永続的変更なし)
何も永続的に変更せずに今すぐ1つのスクリプトを実行したい場合は、Processスコープを使用します:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
これは現在のPowerShellウィンドウにのみ適用されます。閉じると制限が戻ります。グループポリシーでロックされたマシンでも機能します。GPOはプロセスごとのポリシーを制御しません。
解決策4:単一スクリプト用のインラインバイパス
別の方法として、PowerShell起動時に実行ポリシーを直接渡すこともできます:
powershell.exe -ExecutionPolicy Bypass -File .\your-script.ps1
PowerShell 7の場合:
pwsh -ExecutionPolicy Bypass -File .\your-script.ps1
システムポリシーを制御できないバッチファイル、CI/CDパイプライン、またはWindowsタスクスケジューラジョブに最適です。JenkinsやGitHub Actionsのパイプラインでは、まさにこのパターンがよく使用されます。
解決策5:特定のダウンロードファイルをアンブロックする
見落とされがちなポイントです。実行ポリシーが実際の問題ではない場合があります。Windowsはインターネットからダウンロードされたファイルを潜在的に安全でないものとして静かにマークします。そのマークだけで、ポリシー設定に関わらずブロックされることがあります。
スクリプトにこのマークがあるか確認します:
Get-Item .\your-script.ps1 | Select-Object -ExpandProperty Attributes
ファイルにZone.Identifier代替データストリームがある場合は、削除します:
Unblock-File -Path .\your-script.ps1
これだけです。ポリシーの変更は不要です。Windowsがファイルを信頼できないものとして扱うのをやめ、PowerShellは問題なく実行します。
修正を確認する
上記のいずれかの方法を実行した後、ポリシーが正しいことを確認します:
Get-ExecutionPolicy -List
その後、スクリプトを再度実行してください。今度は動作するはずです。
Unblock-Fileアプローチの場合は、ストリームが削除されたことを再確認します:
Get-Item .\your-script.ps1 -Stream *
Zone.Identifierは出力に表示されなくなっているはずです。
何も機能しない場合:グループポリシーがオーバーライドしている
MachinePolicyまたはUserPolicyが制限された値を示している場合、組織のグループポリシーが適用されています。Set-ExecutionPolicyは成功したように見えますが、再確認した瞬間に元に戻ります。
選択肢:
-Scope Processまたはインラインの-ExecutionPolicy Bypassフラグを使用してください。グループポリシーはこれらのどちらもブロックしません。- 開発者マシン向けのGPO例外についてシステム管理者に相談してください。
Invoke-Expressionまたはiexを使用してスクリプトの内容をパイプしてください。ただし、実際に読んで信頼できるコードにのみ使用してください。
学んだ教訓
- 信頼できないコードを実行するマシンで
Unrestrictedを使用しないでください。RemoteSignedが開発者にとって合理的なデフォルトです。 - 共有CI/CDランナーでは、パイプラインコマンド自体に
-ExecutionPolicy Bypassを設定してください。システムポリシーを永続的に変更しないでください。 - チームメイトにスクリプトを配布する場合は、自己署名証明書で署名してリポジトリに含めてください。
AllSignedマシンでの問題を永久に解決できます。 Unblock-Fileは驚くほど活用されていません。ダウンロードしたスクリプトでの「実行ポリシー」エラーの多くは、実際にはゾーン識別子の問題が原因です。

