Share via


プロバイダー ホスティングとセキュリティ

プロバイダーを表す __Win32Provider インスタンスの HostingModel プロパティは、プロバイダー ホスティング モデルを指定します。 このプロパティを設定すると、指定されたレベルの特権を持つ共有ホスト プロセスにプロバイダーが読み込まれます。

共有プロバイダー ホスト プロセス

WMI は、他のいくつかのサービスと共に共有サービス ホストに存在します。 プロバイダーで障害が発生したときにすべてのサービスが停止しないように、プロバイダーは "Wmiprvse.exe" という名前の別個のホスト プロセスに読み込まれます。 この名前の複数のプロセスを実行できます。 それぞれ、セキュリティが異なる別のアカウントで実行できます。 Windows Vista 以降では、winmgmt コマンドを使用し、固定ポートを使って別のプロセスで WMI を単独で実行することに注意してください。 詳細については、Vista 以降での WMI へのリモート接続に関するページを参照してください。

共有ホストは、Wmiprvse.exe ホスト プロセスで次のいずれかのシステム アカウントで実行できます。

プロバイダーには、ローカル COM サーバー (.exe)、または (WMI プロバイダー ホストを必要としない) セルフホステッドを指定することもできます。

ホスティング モデルの設定

LocalSystem は特権アカウントであるため、プロバイダーが Wmiprvse.exe プロセスで実行されている場合は、HostingModelNetworkServiceHost に設定することをお勧めします。 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 プロパティに指定されます。

プロバイダーのホスティング モデルを設定するには

  1. プロバイダーを定義する MOF ファイルに __Win32Provider のインスタンスを作成します。

  2. Name プロパティでプロバイダーに名前を割り当て、プロバイダー COM オブジェクトのクラス識別子 (CLSID) を Clsid プロパティに割り当てます。

    次のコード例では、Name プロパティに名前を割り当て、プロバイダー COM オブジェクトの CSLID を Clsid プロパティに割り当てます。

    Instance of __Win32Provider as $NewProvider
    {
        Name = "MyProvider";
        Clsid = "{.......}";
    }
    
  3. 適切な共有ホスト値を HostingModel プロパティに割り当てます。 "NetworkServiceHost" などの共有ホスト値は、MSFT_Providers クラスの HostingSpecification プロパティに定義されます。

    次のコード例では、HostingModel プロパティに共有ホスト値を割り当てます。

    HostingModel = "NetworkServiceHost";
    

次のコード例は、NetworkServiceHost にプロバイダーを登録する方法を示しています。

Instance of __Win32Provider as $NewProvider
{
    Name = "MyProvider";
    Clsid = "{.......}";
    HostingModel = "NetworkServiceHost";
}

複数のプロバイダーがある場合は、特定のインスタンスに存在するようにプロバイダーを登録して、特定のサービス ホストにグループ化できます。

次のコード例も、NetworkServiceHost にプロバイダーを登録します。 MSFT_Providers クラスは、結合して __Win32ProviderHostingModel プロパティを作成する 2 つの値を定義します。 この例では、"NetworkServiceHost" 値は MSFT_ProvidersHostingSpecification プロパティから取得され、"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 は、__Win32ProviderHostingModel プロパティが 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 に設定されます。 セキュリティ上の理由から、FoldIdentity(FALSE) を指定しないことをお勧めします。これは、Delegate の偽装を使用する非承認のアプリケーションがドメイン全体に影響を与える可能性があるからです。

次の例は、FoldIdentity(TRUE) を設定することと同等である推奨される方法で設定された HostingModel プロパティを示しています。

Decoupled:Com

Decoupled:Noncom

内部使用専用です。 サポートされていません。

ホスティング モデルのセキュリティ

ほとんどの場合、LocalSystem は不要であり、NetworkServiceHost コンテキストの方が適切です。 ほとんどの WMI プロバイダーは、要求された操作を WMI クライアントの代わりに実行するために、クライアントのセキュリティ コンテキストを偽装する必要があります。 Windows Vista 以降、ホスティング モデル定義がなく、LocalSystem で実行されているかのように実行される WMI プロバイダーは正しく実行されません。 この状況を解決するには、予想されるホスティング モデルを変更し、WMI プロバイダー コードが WMI クライアントを偽装してクライアント セキュリティ コンテキストで操作を実行するようにします。 LocalSystem が要件になることはほとんどありません。 プロバイダーにそのレベルの特権が必要な場合は、MOF ファイルに次のステートメントを使用してホスティング モデルを指定します。

HostingModel=LocalSystemHost

正しい登録の選択

WMI 名前空間へのアクセス

WMI 名前空間のセキュリティ保護

プロバイダー構成とトラブルシューティング クラス

MSFT_Providers

WMI セキュリティの維持