tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShellスクリプト(.ps1)を初回実行する際のスクリプト実行セキュリティ・ポリシーについて

はじめに

※本記事はレジストリを触ります。本記事の内容を実行する際は自己責任でお願いいたします。

※本記事の内容をご自身の責任で実行して、万が一障害が発生しても責任は取れません。

※レジストリに関わるため、どうかくれぐれも慎重にご対応願います。

今回は、PowerShellスクリプト(.ps1)をの権限設定の注意について説明します。

せっかく作ったPowerShellスクリプト(.ps1)を本番などにデプロイする際、

検証環境で動いたPowerShellスクリプトが、いざテスト環境や本番環境にコピーすると実行できない。

そんな経験はありませんか?  

 

これは、PowerShellの初期スクリプト実行セキュリティ・ポリシー設定では、PowerShellスクリプト(.ps1)の実行が許可されていないことを忘れているために起こります。

Powerhshellのスクリプト実行セキュリティ・ポリシーの設定は、検証環境など自分の環境で一度実行すると「その後触らなくなる事が多い」ため忘れがちです。 本記事で紹介するので、ご参考にどうぞ。  

説明の最下部に、任意でPowerShellスクリプト実行セキュリティ・ポリシーを変更するバッチを公開しておきます。

TechNetによる解説

Poershellのスクリプト実行に関しては、MSのTechNetに詳細記述があります。 英語に自信のある方は、ここを見ればこの記事いりませんww

"Windows Powershell Owner's Manual -- Running Windows PowerShell Scripts (英語記事)"

 

ポイント

PowerShellスクリプトの初回実行に関するポイントは以下の5点です。

@IT -- PowerShellスクリプトの実行セキュリティ・ポリシーを変更する
  1. 実行セキュリティ・ポリシーには【署名有無】と【ローカル・スクリプトと非ローカル・スクリプト】で4種類ある
  2. Powerhshellのスクリプト実行セキュリティ・ポリシーはデフォルト無効
  3. ps1スクリプトを実行するには管理者権限起動したPowerShellで実行セキュリティ・ポリシーを予め変更する必要がある
  4. 一度変更したセキュリティ・ポリシーは維持される
  5. x64環境とx86環境では、実行セキュリティ・ポリシーを別々に持っている。

 

私自身が陥った例

検証環境でPowerShellスクリプトが上手く動いたー! よーし、次はプレ本番環境でリリース前検証だー。

Powershellスクリプトを実行でエラー(ユーザー)

………あれ……?検証環境では動いたのにPowerShellスクリプト(.ps1)が実行できない!? ユーザー権限でPowerShellを実行したからかな?「管理者として実行」すれば……

PowerShellスクリプトを実行するとエラー

えっ、起動できない……?! 「スクリプトの実行が許可されていない」って、……検証環境では動くのに? .....気を取り直して、原因を見ていきましょう。  

PowerShellのスクリプト実行セキュリティ・ポリシーとは

PowerShellには、スクリプト実行セキュリティ・ポリシーが4種類あります。 ※セキュリティポリシーは4種以外に、BypassやUndefinedの2つも有りますが、通常は利用しないと見込んで省きます。

この内、よくスクリプト実行のために設定されるのがRemoteSignedです。

実行ポリシー 意味
Restricted すべてのスクリプトが実行禁止。PowerShellインストール直後のデフォルト設定
AllSigned 署名されているスクリプトのみが実行可能。署名されていないスクリプトは実行禁止
RemoteSigned ローカルに保存されているスクリプトは実行可能。インターネットからダウンロードしたスクリプト(非ローカルのスクリプト)は、署名されているもののみが実行可能
Unrestricted すべてのスクリプトが実行可能。ただしインターネットからダウンロードしたスクリプトは、実行するかどうかが確認されるので、ユーザーが明示的に許可した場合のみ実行される

 

Windows x64環境を利用している場合の注意

Window x64bit環境ではPowerShellはx64版とx86版の2つがインストールされます。 試しに、powershellで検索して見てください。

Windows x64環境では、2種類が表示されたはずです。(Windows PowerShell ISEは省いています)

  • Windows PowerShell
  • Windows PowerShell (x86)

後段で説明しますが、PowerShellのスクリプト実行セキュリティ・ポリシーは、レジストリ値に保存されます。

当然、x64版PowerShellとx86版PowerShellではレジストリ値は保存パスが異なります。 そのため、PowerShellを呼び出すアプリケーションが、どちらのPowerShellを呼ぶかによって、スクリプト実行セキュリティ・ポリシーを変更するべきPowerShell環境も異なります。

※Windows x64環境におけるx64とx86それぞれのPowerShell.exe実行パスは次の通りです。

:x64 PowerShell
C:\Windows\System32\PowerShell\1.0\powershell.exe
:x86 PowerShell
C:\Windows\SysWOW64\PowerShell\1.0\powershell.exe

※Windows x86環境におけるPowerShell.exe実行パスは次の通りです。

:x86 PowerShell
C:\Windows\System32\PowerShell\1.0\powershell.exe

 

デフォルトのスクリプト実行セキュリティ・ポリシーは?

PowerShellで、一度もスクリプトを実行したことがない環境では、スクリプト実行セキュリティ・ポリシーはRestrictedです。

Restricted すべてのスクリプトが実行禁止。PowerShellインストール直後のデフォルト設定

先に上げた初めてWindows PowerShellを実行する環境において、現在のセキュリティポリシーを確認します。

 

Step1. まずはPowerShellを起動します。(x64環境では、Windows PowerShell (x64)を起動するかWindows PowerShellを起動するかを選びます)

Step2. 現在のセキュリティポリシー確認には、以下のコマンドレットを利用します。

Get-ExecutionPolicy

PowerShell Get-SecurityPolicy

Step3. 結果、初めて起動したPowerShellではRestrictedと表示されました。 これでは、.ps1スクリプトを読み込むことが出来ません。 そこでPowerShellの実行セキュリティ・ポリシーを変更していきます。  

スクリプト実行セキュリティ・ポリシーを変更する

セキュリティポリシーを変更するには、専用コマンドレットによるレジストリ設定の変更を要します。

※レジストリアクセスが発生するため、UACが有効になったWindows Vista/7/8/2008R2/2012では『管理者として実行』されたPowerShellでしか以下のコマンドレットを実行できません。

※Windows XP SP3や2003 R2などのUACが存在しないOSでは、管理者ユーザーPowerShellを起動すれば以下のコマンドレットを実行可能です。 Windows7でPowerShellを管理者として実行する

セキュリティポリシー変更には、以下のコマンドレットを利用します。

Set-ExecutionPolicy [セキュリティポリシー]

例えば、RestrictedをRemoteSignedに変更する場合は、以下のように実行します。

Set-ExecutionPolicy RemoteSigned

※確認ダイアログが出るので、y/nを選択します。 変更後の、 現在のセキュリティポリシー確認には再度以下のコマンドレットを利用します。

Get-ExecutionPolicy

Powershell Set-ExecutionPolicy(Admin)

※ ちなみに、『管理者として実行』されていないPowerShellでセキュリティポリシーを変更しようとすると、

レジストリにアクセスできないことを示すエラーが表示されます。  Powershell Set-ExecutionPolicy(User)

 

 

【実行セキュリティ・ポリシー設定は維持される】

前述の通り、セキュリティポリシーは、レジストリ値に書き込まれています。 そのため、一度セキュリティポリシーを変更すれば、以降は明示的にセキュリティポリシーを変更しない限り維持されます。

つまり、前節のように一度RemoteSignedに変更した後は、ユーザー権限でPowerShellを起動しても(バッチ連動...etc)、.ps1スクリプトを実行することが出来ます。

参考までに保存されるレジストリパスは次の通りです。

※Windows x64環境でのレジストリ保存パス

:x64 PowerShell
HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.Powershell
:x86 PowerShell
HKLM\SOFTWARE\Wow6432node\Microsoft\PowerShell\1\ShellIds\Microsoft.Powershell

※Windows x86環境でのレジストリ保存パス

:x86 PowerShell
HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.Powershell
『管理者として実行』されたPowerShell上での.ps1スクリプト実行 PowerShellスクリプトを実行する(Admin)
Set-ExecutionPolicy設定前と設定後の、通常ユーザーでPowerShell上での.ps1スクリプト実行 PowerShell スクリプト実行(User)

 

自動的にWindows x64とx86のバージョンに応じてスクリプト実行セキュリティ・ポリシーを変更するバッチ

めんどくさい方の為に、以下のバッチファイルを作成しました。

利用方法

1. メモ帳などにコピーした後、拡張子を.batにして保存してください。

2. 保存したバッチファイルを管理者として実行してください。

3. 本当に変更するか、ダイアログが表示されるので、任意の選択をしてください。

修正履歴

[2013/Jan/19] x86での-Scope LocalMachine記述が、誤って-Policy LocalMachineとなっていたため修正

@ECHO OFF

REM ==============================================================
ECHO Now Checking Windows x64/x86 version information......
ECHO .
ECHO ..
ECHO ...
ECHO ....
ECHO .....
ECHO.
IF EXIST %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe GOTO x64
GOTO x86

REM ==============================================================

:x64
REM ==============================================================

ECHO ** Your System was detected as x64bit Windows **
ECHO.
ECHO ----------------------------------------
Echo x86版 PowerShell の LocalMachine 実行ポリシー変更
ECHO ----------------------------------------

ECHO ** Currenct ExecutionPolisy **
%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy -list"

ECHO.
ECHO  ** Changing ExecutionPolisy **
%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -Command "Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Confirm"

ECHO.
ECHO  ** Changed After ExecutionPolisy **
%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy -list"

ECHO ----------------------------------------
Echo x64版 PowerShell の LocalMachine 実行ポリシー変更
ECHO ----------------------------------------

ECHO  ** Currenct ExecutionPolisy **
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy -list"

ECHO.
ECHO  ** Changing ExecutionPolisy **
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Confirm"

ECHO.
ECHO  ** Changed After ExecutionPolisy **
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy -list"

GOTO EOF

REM ==============================================================

:x86
REM ==============================================================

ECHO ** Your System was detected as x86bit Windows **
ECHO.
ECHO ----------------------------------------
Echo x86版 PowerShell の LocalMachine 実行ポリシー変更
ECHO ----------------------------------------

ECHO  ** Currenct ExecutionPolisy **
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy -list"

ECHO.
ECHO  ** Changing ExecutionPolisy **
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Confirm"

ECHO.
ECHO  ** Changed After ExecutionPolisy **
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy -list"

GOTO EOF

REM ==============================================================

:EOF
PAUSE