PowerShellスクリプト(.ps1)を初回実行する際のスクリプト実行セキュリティ・ポリシーについて2012-11-13PowerShellスクリプト(.ps1)を初回実行する際のスクリプト実行セキュリティ・ポリシーについてPowerShellはじめに※本記事はレジストリを触ります。本記事の内容を実行する際は自己責任でお願いいたします。※本記事の内容をご自身の責任で実行して、万が一障害が発生しても責任は取れません。※レジストリに関わるため、どうかくれぐれも慎重にご対応願います。今回は、PowerShellスクリプト(.ps1)をの権限設定の注意について説明します。検証環境で動いたPowerShellスクリプトが、いざテスト環境や本番環境にコピーすると実行できない。そんな経験はありませんか?これは、PowerShellの初期スクリプト実行セキュリティ・ポリシー設定では、PowerShellスクリプト(.ps1)の実行が許可されていないことを忘れているために起こります。Powerhshellのスクリプト実行セキュリティ・ポリシーの設定は、検証環境など自分の環境で一度実行すると「その後触らなくなる事が多い」ため忘れがちです。本記事で紹介するので、ご参考にどうぞ。説明の最下部に、任意でPowerShellスクリプト実行セキュリティ・ポリシーを変更するバッチを公開しておきます。TechNetによる解説Poershellのスクリプト実行に関しては、MSのTechNetに詳細記述があります。(英語記事)"ポイントPowerShellスクリプトの初回実行に関するポイントは以下の5点です。PowerShellスクリプトの実行セキュリティ・ポリシーを変更する実行セキュリティ・ポリシーには【署名有無】と【ローカル・スクリプトと非ローカル・スクリプト】で4種類あるPowerhshellのスクリプト実行セキュリティ・ポリシーはデフォルト無効ps1スクリプトを実行するには管理者権限起動したPowerShellで実行セキュリティ・ポリシーを予め変更する必要がある一度変更したセキュリティ・ポリシーは維持されるx64環境とx86環境では、実行セキュリティ・ポリシーを別々に持っている。よーし、次はプレ本番環境でリリース前検証だー。.....気を取り直して、原因を見ていきましょう。PowerShellのスクリプト実行セキュリティ・ポリシーとはPowerShellには、スクリプト実行セキュリティ・ポリシーが4種類あります。※セキュリティポリシーは4種以外に、BypassやUndefinedの2つも有りますが、通常は利用しないと見込んで省きます。この内、よくスクリプト実行のために設定されるのがRemoteSignedです。すべてのスクリプトが実行禁止。署名されているスクリプトのみが実行可能。ローカルに保存されているスクリプトは実行可能。すべてのスクリプトが実行可能。x64bit環境ではPowerShellはx64版とx86版の2つがインストールされます。試しに、powershellで検索して見てください。x64環境では、2種類が表示されたはずです。(x86)後段で説明しますが、PowerShellのスクリプト実行セキュリティ・ポリシーは、レジストリ値に保存されます。x64版PowerShellとx86版PowerShellではレジストリ値は保存パスが異なります。そのため、PowerShellを呼び出すアプリケーションが、どちらのPowerShellを呼ぶかによって、スクリプト実行セキュリティ・ポリシーを変更するべきPowerShell環境も異なります。x64環境におけるx64とx86それぞれのPowerShell.exe実行パスは次の通りです。x86環境におけるPowerShell.exe実行パスは次の通りです。PowerShellC:\Windows\System32\PowerShell\1.0\powershell.exeデフォルトのスクリプト実行セキュリティ・ポリシーは?PowerShellで、一度もスクリプトを実行したことがない環境では、スクリプト実行セキュリティ・ポリシーはRestrictedです。すべてのスクリプトが実行禁止。PowerShellを実行する環境において、現在のセキュリティポリシーを確認します。PowerShellを起動します。現在のセキュリティポリシー確認には、以下のコマンドレットを利用します。結果、初めて起動したPowerShellではRestrictedと表示されました。これでは、.ps1スクリプトを読み込むことが出来ません。そこでPowerShellの実行セキュリティ・ポリシーを変更していきます。スクリプト実行セキュリティ・ポリシーを変更するセキュリティポリシーを変更するには、専用コマンドレットによるレジストリ設定の変更を要します。Vista/7/8/2008R2/2012では『管理者として実行』されたPowerShellでしか以下のコマンドレットを実行できません。R2などのUACが存在しないOSでは、管理者ユーザーPowerShellを起動すれば以下のコマンドレットを実行可能です。セキュリティポリシー変更には、以下のコマンドレットを利用します。[セキュリティポリシー]例えば、RestrictedをRemoteSignedに変更する場合は、以下のように実行します。RemoteSigned※確認ダイアログが出るので、y/nを選択します。現在のセキュリティポリシー確認には再度以下のコマンドレットを利用します。ちなみに、『管理者として実行』されていないPowerShellでセキュリティポリシーを変更しようとすると、レジストリにアクセスできないことを示すエラーが表示されます。前述の通り、セキュリティポリシーは、レジストリ値に書き込まれています。そのため、一度セキュリティポリシーを変更すれば、以降は明示的にセキュリティポリシーを変更しない限り維持されます。前節のように一度RemoteSignedに変更した後は、ユーザー権限でPowerShellを起動しても(バッチ連動...etc)、.ps1スクリプトを実行することが出来ます。参考までに保存されるレジストリパスは次の通りです。x64とx86のバージョンに応じてスクリプト実行セキュリティ・ポリシーを変更するバッチめんどくさい方の為に、以下のバッチファイルを作成しました。メモ帳などにコピーした後、拡張子を.batにして保存してください。保存したバッチファイルを管理者として実行してください。本当に変更するか、ダイアログが表示されるので、任意の選択をしてください。(9)トップへ戻るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。