ネットで見つけた便利なPowerShellスクリプトや、マニュアルに「このスクリプトを実行してください」と書かれた .ps1 ファイルを動かそうとしたら、赤い文字でこう返ってきた。

.\test.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\work\test.ps1 を読み込むことができません。
詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。

検索すると「Set-ExecutionPolicy RemoteSigned を実行すれば直る」という答えがすぐ見つかります。それ自体は間違っていません。ただ、そのとおりに打っても、次のどれかで止まる人が多いエラーです。

  • 「アクセスが拒否されました」「管理者として実行してください」と言われて、設定が変えられない
  • 設定は変わったのに、ダウンロードした .ps1 だけ「デジタル署名されていません」と別のエラーになる
  • Windows PowerShellでは直ったのに、PowerShell 7(pwsh)で同じスクリプトを開くとまた止まる、あるいはその逆

この記事の結論を先に書きます。このエラーは、Windowsのパソコンが最初からスクリプトを動かさない設定(実行ポリシー Restricted)になっているから出ます。直すときは、管理者権限の要らない「自分のユーザーだけ」の範囲で RemoteSigned にし、ダウンロードしたファイルは中身を確かめてから1つずつブロックを外します。 Bypass や Unrestricted で全部を通すのは、急いでいるときほど避けたほうがいい選び方です。

もとにしたのは、ダウンロードしたスクリプトが動かない人向けに実行ポリシーの変え方を実演した無料動画と、PowerShell超入門の2時間の講座(無料)です。仕様は2026年10月時点のMicrosoft Learnで確かめました。

エラーの正体は「実行ポリシー」

PowerShellには、スクリプトを読み込んで実行してよい条件を決める実行ポリシーという設定があります。Microsoft Learnの「about_Execution_Policies」に一覧があり、よく出てくるのは次の4つです。

実行ポリシー 何が動くか
Restricted 1行ずつ打つコマンドは動く。スクリプトファイルは一切動かない
RemoteSigned 自分のパソコンで書いたスクリプトは動く。インターネットから取ってきたものは、信頼できる発行元の署名が要る
AllSigned 自分で書いたものも含め、すべてに署名が要る
Bypass 何も止めない。警告も出ない

Windows 10・11に最初から入っている Windows PowerShell(powershell.exe) は、どこにも設定がされていなければ、Windowsのクライアントでは Restricted として動きます。Windows Serverなら RemoteSigned です。つまり、買ってきたばかりのパソコンで .ps1 を動かそうとすると、まずこのエラーに当たるのが普通の状態です。設定が壊れているわけではありません。

Restricted が止めるのは、自分で作った .ps1 だけではありません。モジュールの中のスクリプト(.psm1)や、PowerShellのプロファイルも読み込めなくなります。PowerShell超入門の講座では、49分27秒あたり(無料)で、PowerShell Galleryからインストールしたモジュールを Import-Module で読み込もうとしたところでこのエラーが出て、その場で実行ポリシーを変えて読み込み直す流れを見せています。「スクリプトなんて書いていないのに出た」というときは、たいていこのパターンです。

まず今の設定を確かめる

変える前に、どこに何が設定されているかを見ます。

Get-ExecutionPolicy -List

実行ポリシーには「どの範囲に効くか」(スコープ)が5つあり、上にあるものほど強く効きます。

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined
  • MachinePolicy / UserPolicy: 会社のグループポリシーで決められた値。ここに値が入っていたら、手元では変えられません(後述)
  • Process: いま開いているPowerShellの窓だけ。閉じると消える
  • CurrentUser: 自分のユーザーだけ。管理者権限が要らない
  • LocalMachine: そのパソコンの全ユーザー。管理者権限が要る

全部 Undefined なら、Windowsのクライアントでは Restricted 扱いです。これがエラーの原因です。

管理者権限の要らない範囲で RemoteSigned にする

ネットで見つかる手順の多くは Set-ExecutionPolicy RemoteSigned だけを打たせます。スコープを省くと LocalMachine(全ユーザー) を変えに行くので、管理者として開いたPowerShellでないと失敗します。

この詰まり方は、メンバー限定の「Teamsの全チームメンバーをPowerShellで一括エクスポート」の5分43秒あたり(メンバー限定)で、そのまま映っています。ダウンロードしたスクリプトを動かそうとして止められ、実行ポリシーを変えようとしたら「管理者でないとだめ」と怒られ、6分3秒あたりからPowerShellを管理者として開き直して変更し直しています。どの画面でどう怒られ、どこを右クリックすれば「管理者として実行」できるかは、文字で読むより画面で見たほうが早いところです。

自分のパソコンで自分が使うだけなら、管理者権限は要りません。-Scope CurrentUser を付けます。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

確認を求められたら Y で進めます。Set-ExecutionPolicy のリファレンスのとおり、CurrentUser の設定はそのユーザーにだけ効き、LocalMachine の設定より優先されます。変更はすぐに反映されるので、PowerShellを開き直す必要もありません。

全員が使う共用のパソコンで、どのユーザーでも動くようにしたいときだけ、管理者として開いて -Scope LocalMachine を変えます。動画のように管理者で Set-ExecutionPolicy RemoteSigned と打つのは、こちらの操作です。

Bypass と Unrestricted を常用しない

メンバー限定の「PowerShellでEntra IDの最終サインインレポートを作成」の1分46秒あたり(メンバー限定)では、配布元の手順書が最初に「実行ポリシーを Bypass にする」と指示していて、そのとおりに進めています。配布されるスクリプトの手順書にはよくある書き方です。Teamsの動画でも5分14秒あたり(メンバー限定)で「Bypass にすれば何でも実行してしまう」と触れたうえで、RemoteSigned を選んでいます。

Bypass は、警告も確認も出さずに何でも通す設定です。about_Execution_Policies では、PowerShellを部品として組み込んだアプリケーションのための設定と説明されています。手順書に従ってその場で Bypass が必要なら、いま開いている窓だけに効かせます。

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

-Scope Process の設定は窓を閉じれば消えるので、CurrentUser や LocalMachine を Bypass のまま放置するより後片付けが要りません。バッチファイルやタスクスケジューラから1本だけ動かしたいなら、起動するときに指定する方法もあります。

powershell.exe -ExecutionPolicy Bypass -File .\report.ps1

なお、実行ポリシーはセキュリティの壁ではありません。about_Execution_Policies 自身が「セキュリティ境界ではなく、多層防御」と書いていて、中身をコピーして貼り付ければ実行できてしまいます。止めているのは「うっかり動かす」ことで、悪意のある人ではありません。だからこそ、普段は RemoteSigned にしておき、通すときに通すものを自分で選ぶ、という使い方が向いています。

RemoteSigned にしたのに、ダウンロードした .ps1 だけ動かない

RemoteSigned に変えたあと、ダウンロードしてきたスクリプトを実行すると、文面の違うエラーになることがあります。

.\export.ps1 : ファイル C:\Users\you\Downloads\export.ps1 を読み込めません。ファイル C:\Users\you\Downloads\export.ps1 はデジタル署名されていません。
このスクリプトは現在のシステムでは実行できません。

これは失敗ではなく、RemoteSigned が設計どおりに働いた結果です。EdgeやChromeなどのブラウザーは、ダウンロードしたファイルに「インターネットから取ってきた」という印(Zone.Identifier という隠れたデータ)を付けます。RemoteSigned は、この印が付いていて署名の無いスクリプトを止めます。メールの添付ファイルやチャットで受け取ったファイルも同じです。

無料動画の3分5秒あたりでは、実行ポリシーを RemoteSigned にしたあとも、ダウンロードしたスクリプトだけはまだ確認を求められる様子と、その理由を見せています。Teamsの動画でも7分2秒あたり(メンバー限定)で、管理者で RemoteSigned に変えた直後にもう一度怒られ、ここが2つ目のつまずきどころだと説明しています。

中身を確かめてから、ファイルごとにブロックを外す

止まったスクリプトを動かすには、実行ポリシーを緩めるのではなく、そのファイルの印だけを外します。外す前に、メモ帳などで中身を開き、何をするスクリプトなのかを確かめてください。印を外すのは「このファイルは信用する」と自分で決める操作です。

画面でやるなら、エクスプローラーでファイルを右クリックして「プロパティ」を開き、「全般」タブのいちばん下にある「このファイルは他のコンピューターから取得したものです。このコンピューターを保護するため、このファイルへのアクセスはブロックされる可能性があります。」の横の「許可する」にチェックを入れて「OK」を押します。無料動画の3分23秒あたりと、Teamsの動画の7分21秒あたり(メンバー限定)で、どこにそのチェックがあるのかを実際の画面で確かめられます。

PowerShellでやるなら Unblock-File を使います。

Unblock-File -Path .\export.ps1

ZIPで配られたスクリプト集は、エクスプローラーで展開する前にZIPファイルのブロックを外すと、中のファイルにまとめて印が付かずに済みます。展開してしまったあとなら、フォルダーの中から印の付いたファイルを探して確かめられます。

Get-Item .\*.ps1 -Stream Zone.Identifier -ErrorAction SilentlyContinue

ここに出てきたファイルが、まだブロックされているものです。中身を確かめ終わったものだけ Unblock-File に渡します。

Windows PowerShell と PowerShell 7 は、設定が別々

ここが、ネットの手順どおりにやったのに直らない人が多いところです。

Windowsには、最初から入っている Windows PowerShell 5.1(powershell.exe)と、あとから入れる PowerShell 7(pwsh.exe)があり、別々のプログラムとして共存できます。Set-ExecutionPolicy のリファレンスには「Windows PowerShell 5.1 以降では、実行ポリシー設定が異なる場所に格納され、個別に管理されます。Windows PowerShell (powershell.exe) の設定は、PowerShell (pwsh.exe) には影響しません」とはっきり書かれています。

Windows PowerShell 5.1 PowerShell 7
実行ファイル powershell.exe pwsh.exe
設定の保存先 レジストリ powershell.config.json
自分で設定する前の既定(Windows 11) Restricted RemoteSigned(PowerShell 7の解説で「Windows コンピューターの既定」とされている)

このため、次のようなことが起きます。

  • PowerShell 7 では自分で書いたスクリプトが普通に動くのに、エクスプローラーの右クリックやバッチファイルから呼ぶと Windows PowerShell 側で動いて「実行が無効」で止まる
  • Windows PowerShell で RemoteSigned にしたのに、PowerShell 7 で開いたダウンロード済みスクリプトは「デジタル署名されていません」で止まる(PowerShell 7 は最初から RemoteSigned なので、出るのはこちらのエラー)

設定を変えるときは、実際にスクリプトを動かすほうのPowerShellで Get-ExecutionPolicy -List を打って確かめます。どちらで動いているか分からなければ、$PSVersionTable.PSVersion を打てば、5.1 か 7.x かが分かります。

この2つの違いは実行ポリシーだけではありません。最終サインインレポートの動画の2分2秒あたり(メンバー限定)で、Windows PowerShell と PowerShell 7 ではインストールしたモジュールも別物になり、どちらで動かすかで動く・動かないが分かれることがある、と注意しています。手順書が想定しているのがどちらなのかを最初に確かめておくと、実行ポリシー以外のつまずきも減ります。

会社のパソコンで変えられないとき

Set-ExecutionPolicy を打つと、「設定は、より明確なスコープで定義されたポリシーによってオーバーライドされます」という趣旨のエラーや警告が出て、何をしても Get-ExecutionPolicy の値が変わらないことがあります。Get-ExecutionPolicy -List で MachinePolicy か UserPolicy に値が入っていたら、会社のグループポリシーで実行ポリシーが決められています。

about_Execution_Policies によると、グループポリシーの「スクリプトの実行を有効にする」は、手元で設定したすべてのスコープより優先されます。Set-ExecutionPolicy は、手元の設定のほうが厳しい場合でもグループポリシーを上書きしません。これは情報システム部門が意図して決めている設定なので、-ExecutionPolicy Bypass を付けて抜け道を探す前に、そのスクリプトを業務で動かしてよいかを管理者に相談してください。抜けられるかどうかではなく、組織として許されているかどうかの問題です。

「このフォルダーにあるのに認識されない」とは別の問題

似た場面で出る別のエラーに、「〜は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません」があります。こちらは実行ポリシーではなく、PowerShellがスクリプトを見つけられていないエラーです。PowerShellは今いるフォルダーを自動では探さないので、test.ps1 ではなく .\test.ps1 と場所を付けて打つ必要があります。この仕組みは「「認識されません」はプログラムが無いのではない」で詳しく扱っています。

切り分けは文面で分かります。

  • 「認識されません」→ 場所の問題。.\ を付ける、Pathを確かめる
  • 「スクリプトの実行が無効」→ 実行ポリシーの問題。この記事の Get-ExecutionPolicy -List から
  • 「デジタル署名されていません」→ ダウンロードの印の問題。中身を確かめて Unblock-File

迷ったときの手順

  1. エラーの文面で、場所・実行ポリシー・ダウンロードの印のどれかを見分ける
  2. 実際に動かすPowerShell(5.1か7か)で Get-ExecutionPolicy -List を見る
  3. MachinePolicy・UserPolicy に値があれば、会社の設定。管理者に相談する
  4. 無ければ Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  5. ダウンロードしたものは、中身を確かめてから Unblock-File(ZIPなら展開前に)
  6. 手順書が Bypass を求めるなら -Scope Process で、その窓だけにする

最初のつまずきを越えたら、あとは書いてあるスクリプトを動かすだけです。ダウンロードしてから実行できるまでを一続きで見たいなら、無料動画の最初からの5分弱で一通り確かめられます。モジュールのインストールから実行ポリシーの変更、スクリプトを組み立てて動かすところまでを通しで体験したいなら、PowerShell超入門の講座(無料)が入口です。