事象
Powershellを実行すると下記の様なエラーになる。
PS C:\Users\user> .\hoge.ps1
.\hoge.ps1: File C:\Users\user\hoge.ps1 cannot be loaded.
The file C:\Users\user\hoge.ps1 is not digitally signed.
You cannot run this script on the current system.
For more information about running scripts and setting execution policy,
see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.
なお、ポリシーはRemoteSignedに設定変更している。
原因
未署名の外部スクリプト(※1)を実行しようとしていたから。
※1 外部スクリプト
インターネットや外部ネットワークからダウンロードされ、
代替データストリームに Zone.Identifier(ZoneId=3など)が付与されているファイルのこと。
対応方法
以下の方法で実行可能になる。
- Zone.Identifierを削除する。
- PowerShellスクリプトの実行許可ルールを変更する。
- 署名付きファイルに修正する。(※2)
※2 対応難しい場合が多いため、説明割愛
Zone.Identifierの確認方法と削除方法
## 確認方法
# ファイルのすべてのデータストリームを出力
Get-Item .\hoge.ps1 -Stream *
# Zone.Identifierだけ指定(無い場合はエラー)
Get-Content .\hoge.ps1 -Stream Zone.Identifier
## 削除方法
# Zone.Identifier削除専用コマンド
Unblock-File -Path .\hoge.ps1
# ストリーム削除コマンド
Remove-Item -Path .\hoge.ps1 -Stream Zone.Identifier
## 複数削除方法
# カレントディレクトリ配下のすべての .ps1 ファイルのZone.Identifierを解除
Get-ChildItem -Filter *.ps1 | Unblock-File
# サブフォルダーも含めてすべてのファイルのZone.Identifierを再帰的に解除
Get-ChildItem -Recurse | Unblock-File
スコープ確認方法・変更方法
## 確認方法
# 現在適応されているポリシーの確認
Get-ExecutionPolicy
# 各スコープに設定しているポリシーの確認(※3)
Get-ExecutionPolicy -List
## 変更方法(管理者権限があるコンソールで実行する必要有)
Set-ExecutionPolicy -Scope <スコープ名> -ExecutionPolicy <ポリシー名>
### 例:今実行しているコンソールだけ実行可能にする
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
### 例:今ログインしているユーザーは、警告は出すけど実行可能にする
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
※3
各スコープに設定しているポリシーを評価し、適応するポリシーが決定される
実行ポリシーとスコープ名
スコープ名一覧
| 優先度 |
スコープ名 |
適用範囲・特徴 |
| 1 (最優先) |
MachinePolicy |
グループポリシー(GPO)によってPC全体に強制される。一般ユーザーや個別のスクリプトからは変更不可。 |
| 2 |
UserPolicy |
グループポリシー(GPO)によって現在のログインユーザーに強制される。変更不可。 |
| 3 |
Process |
現在のPowerShellプロセス(セッション・タブ)内のみに適用される。ウィンドウを閉じると設定は消滅する。 |
| 4 |
CurrentUser |
現在のログインユーザー全体に適用される。設定はレジストリ(HKCU)に保存され、次回起動時も維持される。 |
| 5 (最底辺) |
LocalMachine |
PC全体(すべてのユーザー)に適用されるデフォルトの保存先。設定の変更には管理者権限が必要。 |
実行ポリシー名一覧
| 実行ポリシー名 |
実質的な権限・挙動 |
外部スクリプトの実行可否 |
Restricted |
すべてのスクリプトの実行を禁止。 インタラクティブな個別コマンドの入力のみを許可する(Windows クライアントOSの既定値)。 |
✕ 不可 |
AllSigned |
署名付きスクリプトのみ許可。 ローカル作成・外部ダウンロード問わず、信頼された発行元のデジタル署名が必要。 |
◯ 許可(要署名) |
RemoteSigned |
ローカル作成は許可、外部ダウンロードは要署名。 ネットから取得したファイル(ZoneId=3)を実行する場合はデジタル署名が必要(Windows Serverの既定値)。 |
◯ 許可(要署名) |
Unrestricted |
すべてのスクリプトを実行許可。 ただし、インターネットからダウンロードした未署名のスクリプトを実行する際には、事前の警告プロンプトが表示される。 |
◯ 許可(警告有) |
Bypass |
すべてのスクリプトを実行許可(警告なし)。 警告やブロックが一切発生しないため、自動化タスクやバックグラウンド処理で広く使われる。 |
◯ 許可 |
Undefined |
この階層(スコープ)での設定は「未定義(空)」であることを示す。 固有の権限は持たず、判断を下位スコープやOSのデフォルト値に委ねる。(※3) |
—(委ねる) |
※4
デフォルト値は、OSにより異なる。
- Windows10/11:Restricted
- Windows Server系:RemoteSigned