プロバイダーのホスティングとセキュリティ
プロバイダーを表す__Win32Provider インスタンスの HostingModel プロパティは、プロバイダー ホスティング モデルを指定します。 このプロパティを設定すると、指定されたレベルの特権を持つ共有ホスト プロセスにプロバイダーが読み込まれます。
共有プロバイダー ホスト プロセス
WMI は、他のいくつかのサービスと共に共有サービス ホストに駐在します。 プロバイダーが失敗したときにすべてのサービスが停止しないように、プロバイダーは "Wmiprvse.exe" という名前の別のホスト プロセスに読み込まれます。 この名前を持つプロセスを複数実行することができます。 それぞれ異なるセキュリティを持つ異なるアカウントで実行できます。 Windows Vista 以降では、固定ポートを使用して別のプロセスで WMI を単独で実行するには、winmgmt コマンドを使用する点に注意してください。 詳細については、「Vista 以降での WMI へのリモート接続」を参照してください。
共有ホストは、Wmiprvse.exe ホスト プロセスで次のいずれかのシステム アカウントで実行できます。
プロバイダーは、ローカル COM サーバー (.exe)、または WMI プロバイダー ホストが不要なセルフホステッドでもかまいません。
ホスティング モデルの設定
LocalSystem は特権アカウントであるため、プロバイダーがWmiprvse.exe プロセスで実行されている場合は、HostingModel を NetworkServiceHost に設定することをお勧めします。 NetworkServiceHost アカウントは、広範な特権を必要としないが、他のシステムとリモートで通信する必要があるサービス用です。
HostingModel プロパティの値を設定しない場合、WMI は既定値の NetworkServiceHostOrSelfHost を設定します。 HostingModel 値が LocalSystemHost に設定されている場合、WMI はトレースを使用して Windows イベント ログにイベント 5603 と 5604 を生成します。 ローカル LocalSystem アカウントは高い特権を持っているため、この設定はお勧めしません。 これらのイベントは、イベント ビューアーで表示できます。 詳細については、「WMI アクティビティのトレース」を参照してください。
分離プロバイダーの HostingModel プロパティを "Decoupled:Com" に設定します。 .NET Framework の Microsoft.Management.Infrastructure からインストルメンテーション クラスを追加することによって作成されたプロバイダーは、分離プロバイダーです。 (System.Management.Instrumentation はサポートされなくなりました。) 分離プロバイダーの作成の詳細については、「アプリケーションへのプロバイダーの組み込み」を参照してください。
ホスティング モデルは、プロバイダーを表す __Win32Provider インスタンスの HostingModel プロパティで指定されます。
プロバイダーのホスティング モデルを設定する方法
プロバイダーを定義する MOF ファイルで、__Win32Provider のインスタンスを作成します。
Name プロパティでプロバイダーに名前を割り当て、プロバイダー COM オブジェクトのクラス識別子 (CLSID) を Clsid プロパティに割り当てます。
次のコード例では、Name プロパティに名前を割り当て、Clsid プロパティにプロバイダー COM オブジェクトの CSLID を割り当てます。
Instance of __Win32Provider as $NewProvider { Name = "MyProvider"; Clsid = "{.......}"; }
適切な共有ホスト値を HostingModel プロパティに割り当てます。 "NetworkServiceHost" などの共有ホスト値は、MSFT_Providers クラスの HostingSpecification プロパティで定義されます。
次のコード サンプルでは、共有ホスト値を HostingModel プロパティに割り当てます。
HostingModel = "NetworkServiceHost";
次のコード サンプルは、NetworkServiceHost にプロバイダーを登録する方法を示しています。
Instance of __Win32Provider as $NewProvider
{
Name = "MyProvider";
Clsid = "{.......}";
HostingModel = "NetworkServiceHost";
}
複数のプロバイダーがある場合は、プロバイダーを登録することでプロバイダーを特定のサービス ホストにグループ化して、特定のインスタンスに駐在するようにできます。
次のコード サンプルでも、NetworkServiceHost にプロバイダーを登録します。 MSFT_Providers クラスは、結合して __Win32Provider HostingModel プロパティを作成する 2 つの値を定義します。 この例では、"NetworkServiceHost" 値は MSFT_Providers の HostingSpecification プロパティから取得され、"LocalServiceHost" は HostingGroup プロパティから取得されます。
Instance of __Win32Provider as $NewProvider
{
Name = "MyProvider";
Clsid = "{.......}";
HostingModel = "NetworkServiceHost:MySharedHost";
}
分離されておらず、Wmiprvse プロセスでホストされているプロバイダーには、特殊な開発の問題が存在します。 詳細については、「プロバイダーのデバッグ」を参照してください。
プロパティまたはクラス プロバイダーの登録を含むプロバイダーを記述している場合、すべてのスレッド モデルが機能するわけではありません。 詳細については、「正しい登録の選択」を参照してください。
インプロセス プロバイダーの HostingModel 値
次のリストは、Wmiprvse.exe プロセスで実行されるプロバイダーの __Win32Provider インスタンスで使用するプロバイダー ホスティング モデルの値の一覧です。
__Win32Provider.HostingModel の値 | 説明 |
---|---|
SelfHost | プロバイダーは、インプロセスではなくローカル サーバー実装の使用を開始します。 プロバイダーが実行されるプロセスのセキュリティ コンテキストによって、プロバイダーのセキュリティ コンテキストが決まります。 |
LocalSystemHost | インプロセスとして実装されたプロバイダーは、LocalSystem コンテキストで実行されている共有プロバイダー ホストに読み込まれます。 Windows Vista 以降、WMI プロバイダーの HostingModel (__Win32Provider.HostingModel プロパティ) が指定されていない場合、LocalSystemHost は既定のホスティング モデルではなくなりました。 詳細については、「ホスティング モデルのセキュリティ」を参照してください。 |
LocalSystemHostOrSelfHost | プロバイダーはセルフホステッドであるか、LocalSystem アカウントで実行されている Wmiprvse.exe プロセスに読み込まれます。 LocalSystem は高い特権を持つアカウントであるため、セキュリティ NT イベント ログにエントリが生成され、この信頼された状態で実行されているプロバイダーの管理者に通知されます。 |
NetworkServiceHost | インプロセスとして実装されているプロバイダーは、NetworkService アカウントで実行されている Wmiprvse.exe プロセスに読み込まれます。 Windows Vista 以降では、WMI プロバイダーの HostingModel (__Win32Provider.HostingModel プロパティ) が指定されていない場合、これが既定のホスティング モデルです。 詳細については、「ホスティング モデルのセキュリティ」を参照してください。 NetworkServiceHost の特権は制限されているため、特権昇格の攻撃の可能性が軽減されます。 プロバイダーがローカル コンピューター内でのみ動作する場合は、HostingModel プロパティを LocalServiceHost に設定します。 |
NetworkServiceHostOrSelfHost | プロバイダーはセルフホステッドであるか、NetworkService アカウントで実行されている WmiPrvse.exe プロセスに読み込まれます。 NetworkServiceHostOrSelfHost は、__Win32Provider の HostingModel プロパティが NULL の場合の既定の構成です。 NetworkServiceHostOrSelfHost が既定であるため、以前のオペレーティング システムのプロバイダーは引き続き Windows Vista、Windows Server 2008、およびそれ以降のオペレーティング システムで動作できます。 |
LocalServiceHost | インプロセスとして実装されているプロバイダーは、LocalService アカウントで実行されている Wmiprvse.exe プロセスに読み込まれます。 LocalService の特権は制限されているため、これはサービスに対して推奨されるホスティング モデルです。 |
分離プロバイダーの HostingModel 値
次の一覧に、分離プロバイダーのプロバイダー ホスティング モデルの値を示しています。
-
Decoupled:Com
-
プロバイダーは、WMI へのクライアントである別のプロセスでホストされる分離プロバイダーです。
次のサンプルは、HostingModel プロパティの FoldIdentity 指定子を FALSE に設定して、プロバイダーがクライアントを借用できるようにする方法を示しています。
Decoupled:Com:FoldIdentity(FALSE)
FoldIdentity が指定されていない場合、FoldIdentity 値は既定で TRUE に設定されます。 セキュリティ上の理由から、Delegate の偽装を含む悪意のあるアプリケーションがドメイン全体に影響を与える可能性があるため、FoldIdentity(FALSE) を指定しないことをお勧めします。
次のサンプルは、推奨される方法で設定された HostingModel プロパティを、FoldIdentity(TRUE) の設定と同等の方法で示しています。
Decoupled:Com
-
Decoupled:Noncom
-
内部使用のみ。 サポートされていません。
ホスティング モデルのセキュリティ
ほとんどの場合、LocalSystem は不要であり、NetworkServiceHost コンテキストがより適切です。 ほとんどの WMI プロバイダーは、WMI クライアントに代わって要求された操作を実行するために、クライアント セキュリティ コンテキストを偽装する必要があります。 Windows Vista 以降では、ホスト モデルの定義がなく、LocalSystem で実行されているかのように実行される WMI プロバイダー は正常に実行されません。 この状況を修正するには、予想されるホスティング モデルを変更し、WMI プロバイダー コードが WMI クライアントを偽装してクライアント セキュリティ コンテキストで操作を実行するようにします。 LocalSystem が要件になることはほとんどありません。 プロバイダーがそのレベルの特権を持っている必要がある場合は、MOF ファイルで次のステートメントを使用してホスティング モデルを指定します。
HostingModel=LocalSystemHost