閉じる

PowerShell実行ポリシーの変更方法:スクリプトが動かない原因と解決策を解説

Windowsでの作業効率化や自動化を進める上で、PowerShellスクリプトの活用は欠かせません。

しかし、いざ自作したスクリプトを実行しようとした際に、「このシステムではスクリプトの実行が無効になっているため、ファイルを開くことができません」といったエラーに遭遇し、作業が止まってしまうことは非常によくあるケースです。

これは、PowerShellに備わっている実行ポリシー(Execution Policy)という安全機能が働いているためです。

この記事では、PowerShellの実行ポリシーの仕組みから、現在の設定の確認方法、そして安全にポリシーを変更してスクリプトを動かすための具体的な手順を詳しく解説します。

設定変更に伴うセキュリティ上の注意点についても触れますので、自身の環境に最適な設定を見つけていきましょう。

PowerShellの実行ポリシーとは

PowerShellの実行ポリシーは、どのような条件下で構成ファイルを読み込み、スクリプトを実行するかを制御するための「安全策」です。

多くのユーザーが誤解しがちですが、これは「ユーザーの行動を制限するセキュリティ境界」ではなく、あくまで不注意によるスクリプトの実行を防ぐための機能として設計されています。

例えば、インターネットからダウンロードした信頼性の低いスクリプトを誤ってダブルクリックしてしまった際に、実行ポリシーが適切に設定されていれば、その実行を未然にブロックできます。

この仕組みを理解し、適切に構成することで、利便性と安全性を両立させた環境を構築できます。

実行ポリシーが制限する対象

実行ポリシーは、主に以下の要素に対して制限をかけます。

  1. .ps1 拡張子のスクリプトファイルの実行
  2. PowerShell プロファイル(Microsoft.PowerShell_profile.ps1)の読み込み
  3. スクリプトを構成する構成ファイルの読み込み

一方で、対話型コンソールで直接コマンドを入力して実行する操作は、実行ポリシーの制限を受けません。

あくまで「ファイルに保存された一連の処理」を読み込む際にチェックが行われます。

実行ポリシーの種類とその違い

PowerShellには、複数の実行ポリシーが用意されています。

環境や用途に応じて、適切なポリシーを選択することが重要です。

ポリシー名説明
Restrictedすべてのスクリプト実行を禁止します。WindowsクライアントOSのデフォルト設定です。
AllSigned信頼された発行元によって署名されたスクリプトのみ実行を許可します。
RemoteSignedローカル作成のスクリプトは許可し、インターネット経由のものは署名を求めます。
Unrestrictedすべてのスクリプトを実行しますが、インターネット経由のものには警告を表示します。
Bypass何もブロックせず、警告も表示しません。一時的な処理によく使われます。
Undefinedポリシーが設定されていない状態です。下位のスコープの設定が適用されます。

1. Restricted(制限あり)

Windows 10やWindows 11などのクライアントOSにおいて、初期状態で設定されているのがこのRestrictedです。

個別のコマンド実行は可能ですが、すべてのスクリプトファイル(.ps1)の実行が禁止されます。

最も安全ですが、自作スクリプトも動かないため、開発や運用には不向きな設定です。

2. AllSigned(すべて署名済み)

スクリプトを実行するためには、信頼された発行元によるデジタル署名が必要になります。

自分で作成したスクリプトであっても、署名がなければ実行できません。

セキュリティレベルは非常に高いですが、署名プロセスの管理コストがかかるため、一般的には厳格な管理が求められる企業環境で使用されます。

3. RemoteSigned(リモートのみ署名済み)

多くの開発者やシステム管理者にとって最も推奨される設定です。

ローカルコンピュータ上で作成したスクリプトは、署名なしで自由に実行できます。

しかし、インターネットや共有フォルダからダウンロードしたスクリプト(「インターネットから取得」という識別子がついたファイル)を実行するには、信頼された署名が必要になります。

4. Unrestricted(制限なし)

署名の有無に関わらず、すべてのスクリプトを実行します。

ただし、インターネットからダウンロードしたスクリプトを実行しようとすると、「実行しますか?」という確認メッセージが表示されます。

安全性の観点からは、あまり推奨されません。

5. Bypass(バイパス)

一切の制限や確認メッセージを表示せずにスクリプトを実行します。

主に、一時的な自動化プロセスや、他のアプリケーションからPowerShellを呼び出す際など、特定のセッションのみで使用されることが多い設定です。

現在の設定を確認する方法

設定を変更する前に、現在のシステムでどのポリシーが適用されているかを確認しましょう。

確認には Get-ExecutionPolicy コマンドレットを使用します。

基本的な確認

PowerShellを開き、以下のコマンドを実行します。

PowerShell
# 現在適用されている実行ポリシーを確認する
Get-ExecutionPolicy
PowerShell
Restricted

出力された結果が Restricted であれば、スクリプトの実行が制限されている状態です。

スコープごとの詳細確認

実行ポリシーは、システム全体、ユーザーごと、あるいは現在のセッションごとなど、複数の「スコープ」で管理されています。

どの階層で何が設定されているかを一覧で確認するには、-List パラメータを使用します。

PowerShell
# すべてのスコープにおけるポリシー設定を表示する
Get-ExecutionPolicy -List
PowerShell
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine      Restricted

このリストでは、上にある設定ほど優先順位が高くなります

例えば、LocalMachineRestricted であっても、CurrentUserRemoteSigned に設定されていれば、現在のユーザー環境ではスクリプトの実行が可能です。

実行ポリシーを変更する手順

それでは、実際に実行ポリシーを変更してみましょう。

変更には Set-ExecutionPolicy コマンドレットを使用します。

管理者権限での実行

LocalMachine(システム全体)のポリシーを変更する場合、PowerShellを「管理者として実行」する必要があります。

管理者権限がない場合、変更コマンドはエラーになります。

手順1:PowerShellを管理者として起動する

スタートメニューから「PowerShell」を検索し、右クリックして「管理者として実行」を選択します。

手順2:ポリシーを変更する

ここでは、推奨設定である RemoteSigned に変更する例を紹介します。

PowerShell
# システム全体の実行ポリシーを RemoteSigned に変更する
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine

コマンドを実行すると、実行ポリシーの変更を確認する警告メッセージが表示されます。

PowerShell
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、
'about_Execution_Policies' ヘルプ トピックで説明されているセキュリティ リスクにさらされる可能性があります。
実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"):

ここで Y または A を入力して Enter キーを押すと、設定が反映されます。

手順3:変更内容の確認

再度、設定が正しく反映されたかを確認します。

PowerShell
Get-ExecutionPolicy
PowerShell
RemoteSigned

これで、ローカルで作成したスクリプトが正常に動作するようになります。

特定のスコープでの変更

システム全体の設定を変更したくない場合や、管理者権限を持っていない場合は、スコープを限定して変更を行うことができます。

現在のユーザーのみ変更する

CurrentUser スコープを変更すれば、自分のログインユーザー環境のみに影響を与え、他のユーザーには影響しません。

この操作には管理者権限は不要です。

PowerShell
# ログイン中のユーザーに対してのみポリシーを変更する
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

現在のセッションのみ変更する

一時的にスクリプトを実行したいだけで、設定を永続化したくない場合は Process スコープを使用します。

PowerShell
# 現在開いているPowerShellウィンドウが閉じられるまで有効な設定
Set-ExecutionPolicy Bypass -Scope Process

この設定は、ウィンドウを閉じると元の設定に戻るため、非常に安全かつ便利な方法です。

スクリプト実行時のエラーを回避する別の方法

実行ポリシーを恒久的に変更したくない場合、スクリプトを実行する瞬間にだけポリシーを一時的に「無視」する方法もあります。

PowerShell起動オプションを使用する

コマンドプロンプトや実行ダイアログからPowerShellスクリプトを呼び出す際、引数として -ExecutionPolicy を渡すことができます。

PowerShell
# 一時的にポリシーを Bypass にしてスクリプトを実行する
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\MyScript.ps1"

この方法を使えば、システムの基本設定を Restricted に保ったまま、必要な時だけ特定のスクリプトを動かすといった運用が可能です。

タスクスケジューラなどでスクリプトを自動実行させる際によく使われる手法です。

ポリシー変更ができない場合のチェックポイント

Set-ExecutionPolicy を実行してもエラーが出る、あるいは設定が変わらない場合は、以下の点を確認してください。

1. 管理者権限の不足

LocalMachine の変更には必ず管理者権限が必要です。

エラーメッセージに「アクセスが拒否されました」といった文言が含まれている場合は、PowerShellを「管理者として実行」し直してください。

2. グループポリシー(GPO)の優先

会社支給のPCなどでは、組織のグループポリシーによって実行ポリシーが強制されている場合があります。

この場合、個人の操作で設定を上書きすることはできません。

Get-ExecutionPolicy -List を実行した際、MachinePolicyUserPolicy に値が入っている場合は、グループポリシーが適用されています。

3. ファイルのブロック解除

インターネットからダウンロードしたスクリプトを RemoteSigned 環境で実行しようとするとエラーが出ることがあります。

これは、ファイルに「Webから取得」というフラグが付いているためです。

この場合は、ファイルのプロパティを開き、「全般」タブの下部にある「許可する」または「ブロックの解除」にチェックを入れて適用することで実行可能になります。

コマンドで行う場合は以下の通りです。

PowerShell
# 特定のファイルのブロックを解除する
Unblock-File -Path "C:\Scripts\DownloadedScript.ps1"

セキュリティに関する重要な考慮事項

実行ポリシーを変更することは、利便性を高める一方で、潜在的なリスクも伴います。

以下のポイントを意識して運用してください。

  1. 原則として RemoteSigned を使用する
    特別な理由がない限り、UnrestrictedBypass をシステム全体に適用し続けるのは避けましょう。


  2. ダウンロードしたスクリプトの中身を確認する
    ネット上のサンプルコードをコピー&ペーストしたり、ファイルをダウンロードしたりした際は、実行前に必ずテキストエディタで内容を確認する習慣をつけましょう。


  3. 最小権限の法則に従う
    システム全体のポリシーを変更するよりも、-Scope CurrentUser や実行時の引数指定を利用して、必要最低限の範囲で許可を与えるのがベストプラクティスです。


まとめ

PowerShellの実行ポリシーは、不適切なスクリプト実行からシステムを守るための重要なガードレールです。

スクリプトが動かないというトラブルは、このポリシーの仕組みを正しく理解し、Set-ExecutionPolicy を使いこなすことで簡単に解決できます。

  • 現在の設定を確認するには Get-ExecutionPolicy -List
  • おすすめの設定は RemoteSigned
  • 一時的な実行なら -ExecutionPolicy Bypass オプションを活用

これらを適切に使い分けることで、安全かつ快適なPowerShell環境を構築し、日々の業務効率化を加速させていきましょう。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!