PowerShellでスクリプト実行して「UnauthorizedAccess」と出たら権限を確認しよう

スポンサーリンク
powershell
スポンサーリンク

はじめに・・・基本的に本記事の内容は同様の内容が諸先輩方により紹介されている。
が、PowerShellスクリプトを紹介する際にどうしても考慮する必要がある点なので、まとめることとした。他サイトと内容重複する点も多々あるがご容赦願いたい。

Powershellでスクリプト実行して「UnauthorizedAccess」と出たら権限を確認しよう

PowerShellでスクリプトを実行したとき、以下のエラーが出てしまう場合がある。

c:\work>PowerShell XXXXX.ps1
 XXXXX.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\work\test.ps1 を読み込むことができませ
 ん。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
 発生場所 行:1 文字:1
 XXXXX.ps1
 ~~ CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
 FullyQualifiedErrorId : UnauthorizedAccess 

これは、多くの場合Windowsの初期設定ではPowerShellのスクリプト実行がポリシーで許可されていないことが原因である。
次のコマンドを実行することで PowerShell のスクリプトの実行ポリシーについて確認できる。
通常初期設定ではRestrictedとなっており、全てのスクリプトの実行が制限されている。

c:\work>PowerShell Get-ExecutionPolicy
 Restricted

各実行ポリシーによる差異は以下の通り。

実行ポリシー署名あり署名なし
ローカル
署名なし
非ローカル
備考
Restricted×××初期設定。すべてのスクリプトの実行を制限。
AllSigned××署名のあるスクリプトのみ許可
RemoteSigned×ローカル上のスクリプトと署名のあるスクリプトのみ許可
Unrestrictedすべてのスクリプトの実行が可能。
ただし非ローカル上のスクリプト実行時は許可が必要
厳密には「Bypass」という権限もあるが、個人的にセキュリティ上非推奨なので掲載しない


対処法は大きく2つ。

  1. 実行ポリシーを変更する
  2. 実行ポリシーを指定したバッチファイルを作成する

PSSecurityException と UnauthorizedAccess は、同じエラーの別の行

このエラーで検索してここにたどり着く人が手がかりにしているのは、たいてい上のエラー出力の下2行のどちらかだと思う。

  • CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
  • FullyQualifiedErrorId : UnauthorizedAccess

この2つは別々のエラーではない。1つのエラーを、2つの角度から表示しているだけである。CategoryInfo はエラーの「分類」で、PSSecurityException は「セキュリティ上の理由で止めた」という意味。FullyQualifiedErrorId はエラーの「識別子」で、UnauthorizedAccess は「許可されていない」という意味になる。

どちらの文字列で検索してきた場合も、実体は同じ、実行ポリシー(ExecutionPolicy)によるブロックである。対処も同じなので、この後を読んでもらえれば解決する。

まず現在の実行ポリシーを確認する

対処に入る前に、今どうなっているかを見ておくと話が早い。

Get-ExecutionPolicy -List

スコープごとの設定が一覧で出る。上のスコープほど優先度が高く、実際に効いているのは Get-ExecutionPolicy を引数なしで実行したときの値である。

ここで MachinePolicy や UserPolicy に Restricted が入っている場合は、グループポリシーで縛られているということなので、この後に書く Set-ExecutionPolicy では上書きできない。会社の PC でこれに当たったら、自分でどうにかする話ではなく、情報システム部門に相談する話になる。

実行ポリシーを変えても直らないときは、ファイルのブロックを疑う

数は多くないが、実行ポリシーを緩めたのに同じエラーが出続けることがある。インターネットからダウンロードした .ps1 ファイルには「このファイルは他のコンピューターから取得したものです」というゾーン情報が付いていて、これが残っているとブロックされる。

ファイルを右クリック → プロパティで、下のほうに「セキュリティ: このファイルは他のコンピューターから取得したものです。」という表示と「許可する」のチェックが出ていないか確認してほしい。出ていれば、PowerShell からは次で解除できる。

Unblock-File -Path .\test.ps1

フォルダごとまとめて解除したい場合は次のようにする。

Get-ChildItem -Path .\scripts -Filter *.ps1 -Recurse | Unblock-File

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

方法①都度都度ExecutionPolicy オプションにより実行ポリシーを変更するやり方

PowerShell のスクリプトの実行時に引数へ ExecutionPolicy を指定して実行する。

c:\work>PowerShell -ExecutionPolicy RemoteSigned XXXXX.ps1

この方法は、実行するスクリプトに対してのみ指定した実行ポリシーが適用される。

メリット…基本ポリシーはデフォルトのままなので、変更範囲を最小限にできる
デメリット…毎回指定してやらないといけない

方法②Set-ExecutionPolicy による実行ポリシーの恒久的変更

実行ポリシーを恒久的にいずれかのポリシーに変更する。
まず、現在のユーザーの権限のみを変更する場合は以下の通り。
※以下の例では「RemoteSigned」に変更をしている。

c:\work>PowerShell Set-ExecutionPolicy RemoteSigned -scope currentuser


全てのユーザーの権限を変更する場合は、システム全体に影響を与えるため管理者権限が必要となる。なので、予めPowerShellを「管理者として実行」で開く必要がある

全てのユーザーの権限をRemoteSignedに変更する場合は以下の通り。

c:\work>PowerShell Set-ExecutionPolicy RemoteSigned

メリット…スクリプト毎に毎回権限を指定してやる必要がない
デメリット…権限によっては予期せぬスクリプトを実行できてしまう可能性がある

補足…管理者権限がない状態で上記コマンドを実行すると以下のようなエラーとなる。

PS C:\work> PowerShell Set-ExecutionPolicy RemoteSigned
 PowerShell : Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
 発生場所 行:1 文字:1
 PowerShell Set-ExecutionPolicy RemoteSigned
 ~~~~~~~~~~~ CategoryInfo          : NotSpecified: (Set-ExecutionPo…soft.PowerShell:String) [], RemoteException
 FullyQualifiedErrorId : NativeCommandError 
 ' へのアクセスが拒否されました。 既定 (LocalMachine) のスコープの実行ポリシーを変更するには、[管理者として実行] オプシ
 ョンを使用して Windows PowerShell を起動してください。現在のユーザーの実行ポリシーを変更するには、"Set-ExecutionPolicy 
 -Scope CurrentUser" を実行してください。
 発生場所 行:1 文字:1
 Set-ExecutionPolicy RemoteSigned
 ~~~~~~~~ CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
 FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyComma 
 nd 

実行ポリシーを指定したバッチファイルを作成する方法

こちらは、PowerShellスクリプトとは別に実行用のバッチファイル(.bat)を用意するやり方である。

バッチの中でPowerShellの起動オプションで実行ポリシーを指定して実行するよう書いてやる。

powershell -ExecutionPolicy RemoteSigned -File XXXXX.ps1

メリット…PowerShell権限をいじらなくて良いので、他者にも配布しやすい
デメリット…バッチファイルからPowerShellスクリプトの参照があるので、セットで運用が必要

どの方法がおすすめか

個人的な所感であるが、業務改善/業務効率化のために他者に利用させることを考えた場合は実行ポリシーを指定したバッチファイルを作成する方法がよいと考えている。

理由は、メリットにも書いたとおり相手にPowerShell権限をいじらせなくてよく、毎回ポリシー指定してやる必要もないためである。

他者を巻き込んだ業務改善/業務効率化を考えたときに、極力相手にエネルギーを使わせないやり方というのは受け入れられやすい。と私は考えている。

ではでは、よき業務改善ライフを。

改版履歴

2026/9/14 PSSecurityExceptionとUnauthorizedAccessが同じエラーであることの説明、実行ポリシーの確認方法(Get-ExecutionPolicy -List)、ファイルのブロック解除(Unblock-File)のセクションを冒頭に追加

コメント

タイトルとURLをコピーしました