こんにちは。チェシャ男です。(-皿-)
今回は、
【 PowerShell スクリプトの実行ポリシー変更方法】
について紹介します。
PowerShell 入門者がスクリプト作成時に「実行できない」問題に直面した場合には本記事を参考に実行ポリシーを変更しましょう。
スクリプトファイルが実行できない原因を確認するための実行ポリシー確認方法はこちら↓の記事をご参考ください。
[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/sequrity/get-executionpolicy/”]
もくじ
Set-ExecutionPolicy で実行ポリシーの変更
スクリプトファイルの実行ポリシーを変更するコマンドレットに、
Set-ExecutionPolicy
といものがあります。
[blogcard url=”https://cheshire-wara.com/powershell/ps-help/set-executionpolicy-help/”]【コマンドレット】
Set-ExecutionPolicy
【オプション】
-ExecutionPolicy <実行ポリシー>
-Scope <設定範囲のスコープ>
-Force
-WhatIf
-Confirm【入力】
Microsoft.PowerShell.ExecutionPolicy
Microsoft.PowerShell.ExecutionPolicyScope【出力】
System.Object
【エイリアス】
なし
Set-ExecutionPolicy の実行
早速、実行してみましょう。
なお、実行ポリシーに設定できる値は以下の表をご覧ください。
実行ポリシー | 内容 | ローカル | リモート |
Restricted | 全てのスクリプトが制限(Restrict)される。 | × | × |
AllSigned | 全て(All )の署名付き(Signed)スクリプトのみ実行可能。 署名がないものは実行禁止。 |
△ (※署名付のみ可) |
△ (※署名付のみ可) |
RemoteSigned | ローカルのファイルは実行可能。 インターネットからダウンロードした外部のスクリプト(Remote)は署名(Signed)が必要。 |
○ | △ (※署名付のみ可) |
Unrestricted | 全てのスクリプトが制限なし(Unrestrict)。 ただし、インターネットからダウンロードしたファイルは実行時、確認される。 |
○ | ○ (※確認あり) |
Bypass | 警告や確認なしに、すべてのファイルが実行可能。 | ○ | ○ |
今回は ”RemoteSigned” に設定しローカルスクリプトの実行を許可します。
Set-ExecutionPolicy コマンドレット実行中の選択肢は「[Y] はい(Y)」を指定してください。
PS C:\> Set-ExecutionPolicy Remotesigned 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' へのアクセスが拒否されました。 既定 (LocalMachine) のスコープの実行ポリシーを変更するには、[管理者として実行] オプションを使用して Windows PowerShell を起動してください。 現在のユーザーの実行ポリシーを変更するには、"Set-ExecutionPolicy-Scope CurrentUser" を実行してください。 発生場所 行:1 文字:1 + Set-ExecutionPolicy Remotesigned + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
おっと。
なにやらエラーが発生しましたね。
15行目を見てみると、
”PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException”
とありますね。
PermissionDenied(アクセス拒否)や UnauthorizedAccessException(許可されていないアクセスエラー)と出ているようです。エラーについて解決策を考えてみましょう。
レジストリを参照しエラーの原因を探る
まず、実行結果の8行目を見てみましょう。
“レジストリ キー ‘HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell’ へのアクセスが拒否されました。”
なにやらレジストリを参照していることが分かりますね。 実際にレジストリを確認してみましょう。
今回はエラー文を参考に、
- キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
- データ:ExecutionPolicy
を参照するため ”Get-ItemPropertyValue” コマンドレットを使用します。
“-Path” オプションに上記のキー、”‐Name” オプションにデータを指定して下さい。
PS C:\> Get-ItemPropertyValue -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell\ -Name ExecutionPolicy Restricted
確かに、今回使用した ”Set-ExecutionPolicy” コマンドレットは HKLM ドライブのレジストリを参照し変更しようとしています。
実行ポリシーの値が ”Restricted” であることも確認できますね。
また、実行結果の9行目を見てみると、
“既定 (LocalMachine) のスコープの実行ポリシーを変更するには、[管理者として実行] オプションを使用して Windows PowerShell を起動してください。”
とあるように LocalMachine(全てのユーザ)スコープがデフォルトの設定先になっています。
→実行ポリシーのスコープについては、実行ポリシーの確認をご覧ください。
先ほどのエラー文の後半、
“[管理者として実行] オプションを使用して Windows PowerShell を起動してください。”
とあるように、今回のエラーの原因は全ユーザに対してレジストリを変更し実行ポリシーを設定しようとしたために発生した「権限不足のエラー」だったことが分かります。
管理者権限で実行ポリシーを設定する
先ほど権限不足のエラーであった事が判明したので、今度は PowerShell を[管理者として実行する]から起動し、”Set-ExecutionPolicy” を実行してみましょう。
上図のように PowerShell を、[管理者として実行]から起動します。
起動した PowerShell 画面に、「管理者」と記載があれば管理者として起動が成功しました。(※下図参照)
それでは、改めて実行ポリシーを ”RemoteSigned” に設定しローカルスクリプトの実行を許可しましょう。
PS C:\> Set-ExecutionPolicy RemoteSigned 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"):Y
今度は、成功したようですね。特にエラーは出ませんでした。
実行結果の表示が無かったので、念のため実行ポリシーの値を取得して確認してみましょう。
PS C:\> Get-ItemPropertyValue -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell\ -Name ExecutionPolicy RemoteSigned PS C:\Users\miyazaki> Get-ExecutionPolicy RemoteSigned
問題ありませんね。
レジストリから確認しても、Get-ExecutionPolicy コマンドレットで確認しても ”RemoteSigned” が表示されますよ!
ちなみに、全ユーザに対して実行ポリシーを適用したくない時もあるかと思います。現在のユーザに対してのみ実行ポリシーを変更したい場合はこちら↓の記事をご覧ください!
[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/sequrity/set-executionpolicy-currentuser/”]スクリプトが実行できるかチェックする
無事、実行ポリシーが変更できたのでスクリプトを実行してみましょう。
使用するスクリプトを下に載せておきます。
Write-Host -Object "I am Cheshire Boy"
たった1行ですが、”test.ps1” と名前を付けたスクリプトファイルを使用します。
“I am Cheshire Boy” と表示されれば成功ですね。
ちなみに、PowerShell スクリプトは、誤操作の防止やセキュリティ向上のためダブルクリックでは実行されません。 メモ帳で開かれるだけです。(笑)
PS C:\> C:\test.ps1 I am Cheshire Boy
成功しましたね。
これであなたの PC でもスクリプトが実行できるようになりました。
ちなみに、この方法はローカルマシンのレジストリに書き込むため、1度設定してしまえば他のユーザでも実行可能になっています。
また、再起動しても実行ポリシーは変更されません。
まとめ
実行ポリシーによって、スクリプト実行エラーが発生する場合は、
Set-ExecutionPolicy <実行できるポリシー>
で変更する。
設定できる実行ユーザは、
- Restricted
- AllSigned
- RemoteSigned
- Unrestricted
- Bypass
- (Undefined)
既定のスコープは、LocalMachine(全てのユーザ)なので1度設定すれば、以降は設定不要!
[…] Set-ExecutionPolicy – PowerShell で実行ポリシーを変更する方法 | チェシャわら […]