ユーティリティ スポットライトWindows PowerShell 用の SMS コマンドレット

Don Brown

この記事で使用しているコードのダウンロード: Utility2007_11.exe (1211KB)

今まで、Microsoft System Management Server (SMS) 2003 クライアントをコマンド ラインから管理する方法はありませんでした。さいわい、管理者が複雑な作業、変更、および構成を管理するのに役立つ、最近登場した多くの優れたテクノロジの 1 つである Windows PowerShell を使用して、この問題を解決できます。

Windows PowerShell を活用するために、SMS2003PowerShellSnapinSample という簡単な "ユーティリティ" を作成しました。このサンプルは、このコラムに付属しているダウンロード (technetmagazine.com/code07.aspx でも提供されています) に含まれています。このユーティリティは、6 つのコマンドレットから構成された 1 つの Windows PowerShellTM スナップインです。これらのコマンドレットを Windows PowerShell から使用して SMS クライアント ローカル ポリシーを構成し、ローカル コンピュータまたはリモート コンピュータのグループに適用できます。

SMS クライアント ローカル ポリシーのさまざまな構成を試すことにより、このポリシーに対する理解が深まりました。また、SMS のしくみもよく理解できました。SMS クライアント ローカル ポリシーを慎重に適用することで、SMS クライアントをまったく新しい方法で制御できること、つまり、同じサイトへのレポートを実行するすべてのコンピュータで同じ構成を使用する必要はないということがわかりました。コンピュータをリモートで制御する際に許可を要求されないように特定のコンピュータを設定する方法、新しいポリシーがあるかどうかをクライアントが確認する頻度を変更する方法、特定のコンポーネントをさまざまな時刻に無効にする方法など、多くのアイデアが浮かんできました。SMS クライアント ローカル ポリシーの使用方法は無限にあります。それでは、詳しく見ていきましょう。

SMS アドバンスト クライアント ローカル ポリシーについて

プログラミングに関する参考資料

すべての有効な SMS 2003 アドバンスト クライアントには、構成ポリシーが適用されます。基本的に、このポリシーはさまざまなコンポーネントを制御する設定の一覧であり、クライアント、インベントリ コレクション、ソフトウェアの配布などに関するすべての設定が含まれています。ポリシー自体はサイト サーバー上に作成され、SMS 管理ポイントからアドバンスト クライアントに配布されます。

実際の SMS ポリシーの本体は、アドバンスト クライアントの \\.\root\CCM WMI (Windows® Management Instrumentation) 名前空間にコンパイルされる一連のインスタンスが含まれているという点で、マネージ オブジェクト形式 (MOF) ファイルに似ています。インスタンスがコンパイルされた後、他のさまざまなエージェントによって、\\.\root\ccm\policy\machine\requestedconfig 名前空間に配置されたこれらのポリシーの設定が読み取られます。ただし、MOF ファイルを使用してローカル ポリシーを適用する場合、1 台のコンピュータで 1 つの MOF ファイルしかコンパイルできないため、ローカルで (または、そのコンピュータに直接ログオンしたときに) MOF ファイルを実行する必要があります。一方 WMI は分散型であるため、ローカルとリモートの両方からアクセスすることができます。これにより、SMS 管理者の選択肢が広がります。つまり、適切な管理者権限を持っていれば、ローカル コンピュータで WMI に接続するのと同じぐらい簡単に、リモート コンピュータで WMI に接続できるということです。

SMS クライアント ポリシーは、さまざまなクライアント コンポーネント用の構成設定から構成されていますが、ソフトウェア パッケージのコンテンツの実行に関する指示が含まれている場合もあります。Active Directory® グループ ポリシーの場合と同様に、SMS 管理ポイントから取得される SMS 2003 アドバンスト クライアント ポリシーよりも、SMS クライアント ローカル ポリシーを優先させることができます。ポリシーのすべての部分を優先指定することはできませんが、重要度の高いいくつかのプロパティを優先させることができます。これにより、SMS 管理者は、SMS サイトで適用される標準の構成の例外を指定できるようになるため、SMS クライアントの構成と操作をより細かく制御できます。

たとえば、SMS 管理者がサーバーとワークステーションの両方を 1 つの SMS プライマリ サイトのクライアントとして管理する、セキュリティが確保された統合環境があるとします。この架空の環境のセキュリティ ポリシーでは、ヘルプ デスクの技術者がユーザーのコンピュータをリモートで制御する前に、ユーザーがその操作を許可する必要があることが指定されています。ヘルプ デスクの技術者がリモート コントロールを使用してサーバーに接続する必要がある場合、当然問題が発生します。通常、どのユーザーもサーバーにはログオンしていないため、リモート コントロールによる操作を許可できるユーザーが存在しないことになります。しかし、ローカル ポリシーを注意深く適用することによって、特定のクライアントでユーザーの許可を求めるポリシーを無効にすることができます。SMS ローカル ポリシーを使用して特定の SMS クライアント エージェントの構成を例外的に変更すると便利な状況は、他にもたくさん想像がつくと思います。

Windows PowerShell スナップインの内部

Windows PowerShell の基礎をある程度理解したら、このコラムに付属しているサンプル ソース コードに追加して、コマンド ラインから SMS クライアント ローカル ポリシーに対して実行できる操作を拡張できます。Windows PowerShell に公開するクラスには、いくつかの属性を適用する必要があります。また、コマンドレットの実行対象と、実行する操作を決定する必要があります。これを "動詞 - 名詞" のペアと呼びます。Windows PowerShell で使用する一般的な動詞には、Add、Get、Set などがあります。名詞部分は、操作対象のオブジェクトを示しています。通常、コマンドレットには、Cmdlet クラスでさまざまな型のパブリック プロパティとして宣言されるパラメータが用意されています。最後に、ProcessRecord 関数は、ほとんどの操作を行う主要部分です。図 1 は、独自のコマンドレットに使用できる汎用テンプレートを示しています。

Figure 1 コマンドレット テンプレート

[Cmdlet( "Verb", "Noun", SupportsShouldProcess = true )]
public class Verb_Noun : PSCmdlet
{
    [Parameter( ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, 
        HelpMessage = "Parameter" )]
    [ValidateNotNullOrEmpty]
    [Alias( "param" )]
    public string Parameter
    {
        get { return MyParameter; }
        set { MyParameter = value; }
    }
    private string MyParameter;

    protected override void ProcessRecord( )
    {
        //Do your stuff here!
    }
}

スナップインをコンパイルしたら、RunInstaller 属性が設定され、特定のプロパティが定義されたクラスをプロジェクトに含めることによって、スナップインを Windows PowerShell に登録します。詳細については、この記事に付属しているソース コードを参照してください。スナップインを登録するには、Microsoft® .NET Framework に含まれている InstallUtil.exe ツールを使用する必要があります。図 2 は、スナップインの登録に使用する構文を示しています。Windows Vista® の場合、この操作には権限の昇格が必要になるため、管理者として実行するためのオプションを使用して Windows PowerShell を開くか、Windows Vista 用のスクリプト昇格 PowerToy (technetmagazine.com/issues/2007/06/UtilitySpotlight からダウンロードできます) を使用する必要があります。

Figure 2 Windows PowerShell でのスナップインのインストール

PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil 
PS> installutil C:\MySMSTools\SMS2003PowerShellSnapinSample.dll 
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.42 
Copyright (C) Microsoft Corporation. All rights reserved. 
Running a transacted installation. 
... 
The transacted install has completed.

次に、スナップインが Windows PowerShell によって認識されたかどうかを確認します。Registered パラメータを指定して Get-PSsnapin コマンドレットを実行すると、Windows PowerShell に現在読み込まれているスナップインと、追加できる登録済みのスナップインの一覧が表示されます。登録したスナップインがこの一覧に表示されます。

PS> Get-PSsnapin -registered

ここで、次のように Add-PSsnapin コマンドレットを使用すると、Windows PowerShell スナップインをシェルに追加できます。

PS> add-pssnapin SMS2003PowerShellSnapinSample

操作が成功したら、Windows PowerShell スナップインに含まれているコマンドレットを実行できるようになります。

特定の Windows PowerShell スナップインによって使用できるようになったすべてのコマンドレットを表示するには、そのスナップインの名前を Get-Command コマンドレットの PSsnapin パラメータの値として指定します。このコラムに付属しているサンプル スナップインの場合、Verb-Noun (動詞 - 名詞) コマンドレット テンプレートを含む 6 つのコマンドレットが表示されます (図 3 を参照)。

図 3 スナップインに含まれているコマンドレットの表示

図 3** スナップインに含まれているコマンドレットの表示 **(画像を拡大するには、ここをクリックします)

サンプル ソース コードでは、Get-SMSServerConnection コマンドレットのヘルプのみを記述して、このコマンドレットの構造を示しました。さらに詳しいヘルプが必要な場合は、XML ファイルの例をモデルとして参照してください。図 4 は、ヘルプの出力を示しています。

Figure 4 Get-Help のサンプル出力

PS > get-help Get-SMSServerConnection

NAME
    Get-SMSServerConnection

SYNOPSIS
    This cmdlet establishes a connection to the specified SMS primary site server using your current credentials. An object of type "SMSProvider" is returned through the pipeline.

SYNTAX
    Get-SMSServerConnection [-SMSServerName] [<string>] [<CommonParameters>]

DETAILED DESCRIPTION
    This Cmdlet makes a connection to the specified SMS primary site server.  An object of type "SMSProvider" is returned. The "SMSProvider" object is not serializable and is used only to forward on through the pipeline to other cmdlets.

RELATED LINKS

ここまでは、Windows PowerShell スナップインをインストールする方法、スナップインに含まれているコマンドを確認する方法、および一般的なコマンドレットのヘルプを表示する方法を確認してきました。それでは、実際にコマンドレットを使ってみましょう。SMS プライマリ サイト サーバーにあるすべてのコレクションの一覧を表示するには、次のコマンドを使用します。

PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | Format-Table Name

パイプラインに注目してください。パイプラインは Windows PowerShell の動作の中心となる、非常に強力なツールです。Windows PowerShell では、ほぼすべての操作を 1 行で実行できます。Get-SMSServerConnection は、SMS サーバーとの接続を確立するコマンドレットです。Get-Collections コマンドレットには、Get-SMSServerConnection から返される型の入力パラメータを 1 つ指定すればよいため、単に Get-SMSServerConnection コマンドレットの出力を Get-Collections コマンドレットに渡すだけで済みます。これがパイプラインのしくみです。上記の例は、複雑なオブジェクトをあるコマンドレットから別のコマンドレットに渡す方法を示す良い例です。オブジェクトを変数に格納することもできます。Windows PowerShell スクリプトでこの操作を行う場合、コードは次のようになります。

$SMS = Get-SMSServerConnection 
     -server MYSMSSERVER
Get-Collections -SMSServerProvider $SMS

Get-Collections は SMSCollections 型のオブジェクト (基本的には SMSCollection 型のオブジェクトの配列) を返すため、出力の形式を整えなければ少し読みにくくなる可能性があります。つまり、確認が不要なコレクションをフィルタで除外して非表示にしたり、確認が必要なプロパティのみが含まれた表を表示して出力の形式を整えたりしなければ、あまり見栄えがよくありません。これを行うには、パイプラインを使用して、Get-Collections コマンドレットの出力を Format-Table コマンドレットに渡します。Format-Table コマンドレットを使用することによって、指定したプロパティのみを表示できます。たとえば、"| Format-Table Name, Members" を追加します。

しかし、特定のコレクションのすべてのメンバを表示する場合、もう少し適切な方法があります。このサンプルの Get-CollectionMembers を使用してください。このコマンドレットは、コレクションの各メンバの名前を表す文字列が格納された配列を返します。ご想像のとおり、パイプラインを使用してこの配列を次のコマンドレットに渡すことによって、より見やすい形式でコレクションのメンバを表示できます。

ここまでは、SMS プライマリ サイト サーバーに接続し、コレクションとコレクション メンバを列挙しただけで、SMS アドバンスト クライアント ローカル ポリシーはまだ登場していません。このサンプル Windows PowerShell スナップインに含まれている最後の 2 つのコマンドレットは、Enable-SoftwareDistribution と Disable-SoftwareDistribution です。ここで、SMS クライアント ローカル ポリシーが登場します。これら 2 つのコマンドレットでは、SMS アドバンスト クライアントの SMS クライアント ローカル ポリシーに含まれている、ソフトウェア配布クライアント エージェント コンポーネントに関する設定を操作します。コマンドレットの動詞部分から推測できるとおり、Disable では、ソフトウェア配布クライアント エージェントが無効になるように、クライアント ローカル ポリシーを優先指定します。同様に、動詞 Enable では、クライアント ローカル ポリシーの優先指定をすべて取り消して、ソフトウェア配布クライアント エージェントに関する設定を、SMS 管理ポイントから配布される SMS ポリシーで定義されている通常の状態に戻します。図 5 は、Windows PowerShell の 1 行のコード例を示しています。この例では、SMS クライアント ローカル ポリシーのソフトウェア配布クライアント エージェントに関する設定を優先指定して、Windows Server 2003 Systems カスタム コレクションのすべてのメンバでソフトウェア配布クライアント エージェントを強制的に無効にします。図 5 には、同じコレクションで、SMS クライアント ローカル ポリシーのソフトウェア配布クライアント エージェントに関する優先設定をすべて取り消すコードも記載されています。SMS クライアント ローカル ポリシーを操作するコンピュータが数台しかない場合は、Disable-SoftwareDistribution コマンドレットと Enable-SoftwareDistribution コマンドレットを単独で使用することもできます。

Figure 5 コマンドレットの組み合わせ例

PS >Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Disable-SoftwareDistribution 
PS >
PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Enable-SoftwareDistribution
PS >
PS >Disable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3
PS >
PS >Enable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3

次のステップ

この記事に付属しているサンプル ソース コードを基にして、SMS クライアント ローカル ポリシーの優先指定をコンピュータのグループに適用することができます。このサンプルでは、SMS ソフトウェア配布クライアント エージェントの Enabled プロパティのみを操作しています。その他のクライアント エージェントには、同じ方法で優先指定できる多くのプロパティがあります。基盤となる方法を理解したら、次は SMS クライアント ローカル ポリシーの他の設定を操作しましょう。管理しているシステムで、どのグループの SMS クライアント ローカル ポリシーを優先指定すればよいか、およびローカル ポリシーのどの設定を優先指定すればよいかを考えてみてください。最後に 1 つ、常にラボ環境で徹底的にテストを行い、発生する可能性がある状況を知っておくことをお勧めします。

Don Brown は、彼の記憶にある限りでは今までずっと、Microsoft のシニア プレミア フィールド エンジニアとして、SMS (および SCCM) に関する業務とサポートを担当しています。Don の連絡先は donbrown@microsoft.com (英語のみ) です。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.