Operations Lab.

Archive for 11月 2015

SCOM タスクから PowerShell スクリプトを実行する

leave a comment »

System Center 2012 SP1 Operations Manager のタスクとして、PowerShell スクリプトを実行する方法です。

System Center Operations Manager のエージェントタスク

System Center Operations Manager (SCOM)のエージェントタスクは、管理対象(ターゲット)コンピューター上で実行されるスクリプトまたはプログラムです。エージェントタスクを実行すると、ターゲットコンピューター上で処理が実行され、その出力が SCOM コンソールに表示されます。

エージェントタスクは以下の 3 種類(Windows コンピューター向けには 2 種類)です。

  1. コマンドライン タスク
  2. UNIX/Linux シェルコマンド タスク
  3. スクリプト タスク

PowerShell スクリプトを実行したい場合、スクリプト タスクを使用したくなりますが、スクリプト タスクは VBScript および JScript を実行するためのタスクです。PowerShell スクリプトは実行できません。

PowerShell スクリプトを実行する場合は、コマンドライン タスクを使用します。

PowerShell スクリプトを実行するタスクの作成

「ファイルへの完全パス」に powershell.exe のパスを、「パラメーター」にスクリプトファイルの指定を含む、各種引数を設定します。

scom-task-powershell

ここでは、mgr01 の管理共有経由でアクセス可能なスクリプトファイルを実行するスクリプトとして指定しています。-NoLogo で powershell.exe 起動時のロゴ表示を抑制し、-ExecutionPolicy でこのタスクのみ実行ポリシーを Bypass に変更しています。(管理共有上のスクリプトが、外部スクリプトと認識されるため。)

参考

SCOM タスクとして登録する際に、該当のスクリプトのみ実行ポリシーを変更する方法は、以下のポストをご確認ください。

広告

一時的に PowerShell スクリプト実行ポリシーを変更する

with one comment

意外と知らないという方が多かったので、まとめておきます。

PowerShell でスクリプトを実行するには

PowerShell でスクリプトを実行するためには、実行ポリシー(Execution Policy)が適切に設定されている必要があります。実行ポリシーは、ヘルプ トピックの about_Execution_Policies に詳しく書かれています。

Windows PowerShell の実行ポリシーを使用して、Windows PowerShell によって構成ファイルが読み込まれてスクリプトが実行される条件を決定できます。

実行ポリシーは、ローカル コンピューター、現在のユーザー、特定のセッションに設定できます。グループ ポリシー設定を使用して、複数のコンピューターやユーザーに実行ポリシーを設定することもできます。

ローカル コンピューターの実行ポリシーと現在のユーザーの実行ポリシーは、レジストリに格納されます。Windows PowerShell プロファイルに実行ポリシーを設定する必要はありません。特定のセッションの実行ポリシーは、メモリ内にのみ格納され、セッションが閉じられると失われます。

実行ポリシーはユーザーの操作を制限するセキュリティ システムではありません。たとえば、ユーザーはスクリプトを実行できないとき、コマンド ラインでスクリプトの内容を入力すると、容易にポリシーを回避できます。一方で、実行ポリシーを使用して基本的な規則を設定することで、意図せずに違反することを防止することができます。

PowerShell コンソール上でヘルプを表示する場合は、以下を実行します。

Get-Help about_Execution_Policies

現在の設定を取得する場合は、Get-ExecutionPolicy コマンドレットを使用します。

PS C:\> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine    RemoteSigned


PS C:\>

各スコープに対して、現在どのようなポリシーが適用されているか確認できます。

Execution Policy の種類

簡潔に記載すると以下の通りです。詳細は、TechNet を参照してください。

Restricted

  • いかなる場合もスクリプトや外部モジュールの実行は禁止
  • クライアント系 OS および 2012 までのサーバー系 OS の既定

AllSigned

  • 全てのスクリプトに電子署名が必要
  • 電子署名の証明書が信頼されていない場合は、確認メッセージを表示

RemoteSigned

  • 原則 AllSigned と同じだが、ローカル(NTFS Zone.Identifier 的な意味で)のスクリプトについては署名なしで実行可能
  • 2012 R2 以降のサーバ系 OS の既定

Unrestricted

  • 全てのスクリプトを実行可能だが、ローカルのスクリプト以外は警告を表示

Bypass

  • 全てのスクリプトを実行可能で、かつ警告も出さない

スコープ

実行ポリシーはスコープに対して適用されます。スコープごとに異なるポリシーを設定することもできます。その場合、上位のスコープに設定されたポリシーが優先されます。(全て Undefined の場合は、Restricted とみなされます。)

  1. MachinePolicy : グループポリシーのコンピューターポリシーによる設定
  2. UserPolicy : グループポリシーのユーザーポリシーによる設定
  3. Process : ある PowerShell プロセス内(のみ)
  4. CurrentUser : あるコンピューターの、あるユーザーのみ(あるコンピューターの、特定ユーザーのグローバル設定)
  5. LocalMachine : あるコンピューターのみ(あるコンピューターの、全ユーザーのグローバル設定)

1 と 2 はグループポリシーによる設定、3 ~ 5 は、Set-ExecutionPolicy を使用して設定します。

一時的に Execution Policy を変更する

やっと本題です。上記に記載の通り、PowerShell の実行ポリシーはグループポリシーで強制されていない限りプロセス単位で変更が可能です。かつ、Process スコープ(および CurrentUser スコープ)は、管理者でなくともポリシーの設定が可能です。

PowerShell 起動後(開始後)に変更

PowerShell プロセス起動後は、Set-ExecutionPolicy の –Scope パラメーターで Process を指定すると、それ以降のポリシーを変更できます。

PS C:\> Get-Content C:\ps\sample01.ps1
$PSHOME
PS C:\> .\ps\sample01.ps1
.\ps\sample01.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\ps\sample01.ps1 を読み込むこと
ができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してく
ださい。
発生場所 行:1 文字:1
+ .\ps\sample01.ps1
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\> Set-ExecutionPolicy -Scope Process -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:\> .\ps\sample01.ps1
C:\Windows\System32\WindowsPowerShell\v1.0
PS C:\>

PowerShell 起動時に変更

PowerShell 起動時に、その(これから起動する)PowerShell プロセスのみポリシーを変更したい場合は、powershell.exe のオプションとしてポリシーを渡します。

C:\>powershell.exe -NoLogo -ExecutionPolicy RemoteSigned -File .\ps\sample01.ps1
C:\Windows\System32\WindowsPowerShell\v1.0

C:\>

まとめ

  • 特定のバッチやタスクのみ、一時的な対応などでスクリプトの実行が必要な場合は、一時的に(該当プロセスのみ)実行ポリシーを変更してスクリプトを実行できます。
  • 管理者としてユーザーによる一時的な実行ポリシーの変更が許容できない場合は、グループポリシーでのポリシー配布が必要です。