IWbemServices およびその他のプロキシでのセキュリティの設定
C++ では、プロセス全体でセキュリティを設定するには、IWbemLocator::ConnectServer によって WMI に接続する前に CoInitializeSecurity を呼び出します。 また、IWbemServices や IWbemCallResult などの WMI プロキシへのポインターを取得する呼び出しで、認証レベル、偽装レベル、または認証サービスを変更することもできます。 CoSetProxyBlanket を呼び出すと、認証サービス (Kerberos、NTLM、またはネゴシエート) を変更することもできます。
スクリプトおよび Visual Basic アプリケーションでは、SWbemServices やその他のオートメーション オブジェクトの呼び出しを通じて間接的にのみプロキシにセキュリティが設定されます。 スクリプトでの認証と偽装の設定と変更の詳細については、「VBScript を使用した既定のプロセス セキュリティ レベルの設定」を参照してください。
セキュリティ レベルまたはサービスの変更は、別のオペレーティング システムを実行しているリモート コンピューター上の WMI に接続するときに主に問題となります。 詳細については、「異なるオペレーティング システム間の接続」を参照してください。
クライアント アプリケーションは、ID を使用して WMI プロキシに接続します。 ID は、ユーザー名、パスワード、および権限の設定で構成されるデータ オブジェクトです。 WMI クライアント アプリケーションの場合、IWbemLocator::ConnectServer インターフェイスを呼び出すと、初期 ID が作成されます。 ConnectServer メソッドでは 3 つのパラメーターのセットで ID を受け取り、これは現在のユーザーを示すために NULL に設定できます。 NULL 以外のパラメーターを指定して、特定のユーザーとドメインを示すこともできます。 呼び出しが成功した場合、ConnectServer からポインターが返され、このポインターを使用して、WMI サービスや Windows オペレーティング システムなど、さまざまなリモート プロセスに直接アクセスできます。
多くの COM インターフェイスと同様に、ConnectServer ではプロキシへのポインターが返されます。 プロキシは、WMI やリモート プロバイダーなどのリモート プロセスを表すデータ オブジェクトです。 COM ではプロキシを使用して、データがローカルにある場合と同様に、開発者がリモート データにアクセスできるようにします。
次の WMI インターフェイスではプロキシが使用されます。
IWbemServices (SWbemServices スクリプト オブジェクト)
IWbemRefresher (SWbemRefresher スクリプト オブジェクト)
WMI リフレッシャーは、セキュリティ設定を適切に設定する必要がある IWbemServices ポインターが渡されるため、特別なケースです。 リフレッシャー オブジェクトの使用の詳細については、「C++ でのパフォーマンス データへのアクセス」を参照してください。
リモート プロセスへのポインターを受け取った後、2 つの操作のいずれかを実行できます。 プロセスが何を行うかがわかっている場合は、ポインターにセキュリティを設定し、通常どおりプロセスにアクセスすることを選択できます。 これは、WMI サービスへのほとんどのポインターの場合に該当します。 詳細については、「WMI 接続でのセキュリティ レベルの設定」を参照してください。 あるいは、プロキシ上の IUnknown インターフェイスを呼び出して、プロキシ上の別の COM インターフェイス (IUnknown::Release など) にアクセスする必要があります。
既定と推奨
コンポーネント オブジェクト モデル (DCOM) の分散バージョンでは、既定の認証サービス (Kerberos、NTLM、またはネゴシエート) がネゴシエートされ、CoInitializeSecurity を使用して既定の認証サービスを指定することはできません。 CoSetProxyBlanket の認証サービス パラメーターに RPC_C_AUTHN_DEFAULT を指定すると、DCOM では適切なサービスを選択できます。 リモート接続の場合、既定のサービスはネゴシエートです。これは、Kerberos ドメインと Kerberos 以外のドメインの両方で機能するアプリケーションに推奨されるサービスです。 ローカル接続の場合、既定の認証サービスは NT LAN Manager (NTLM) です。
次のコード例では、使用されている既定の認証サービスが示されています。
// The pWbemServices variable is of type IWbemServices*
HRESULT hr = CoSetProxyBlanket(
pWbemServices, //Proxy
RPC_C_AUTHN_DEFAULT, //Authentication service
RPC_C_AUTHZ_DEFAULT, //Authorization service
COLE_DEFAULT_PRINCIPAL, //Server principal name used
// by authentication service
RPC_C_AUTHN_LEVEL_DEFAULT, //Authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, //Impersonation level
COLE_DEFAULT_AUTHINFO, //Client identity
EOAC_DEFAULT //Capability flags
);
このトピックのコード例では、次の参照と #include ステートメントが必要です。
#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>
#pragma comment(lib, "wbemuuid.lib")
スクリプトの場合は、リモート呼び出し用に DCOM で選択される既定値を使用することをお勧めします。 ローカル コンピューターでは、WMI への呼び出しに対して認証サービスを指定することはできません。 詳細については、「VBScript を使用した認証サービスの設定」および「モニカー文字列の作成」を参照してください。