はじめに・・・基本的に本記事の内容は同様の内容が諸先輩方により紹介されている。
が、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 | ○ | ○ | △ | すべてのスクリプトの実行が可能。 ただし非ローカル上のスクリプト実行時は許可が必要 |
対処法は大きく2つ。
- 実行ポリシーを変更する
- 実行ポリシーを指定したバッチファイルを作成する
実行ポリシーを変更する方法
方法①都度都度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権限をいじらせなくてよく、毎回ポリシー指定してやる必要もないためである。
他者を巻き込んだ業務改善/業務効率化を考えたときに、極力相手にエネルギーを使わせないやり方というのは受け入れられやすい。と私は考えている。
ではでは、よき業務改善ライフを。
コメント