WMI による委任
リモート システムからデータを取得するローカル システムでスクリプトを実行すると、WMI はリモート システム上のデータのプロバイダーに資格情報を提供します。 必要なネットワーク ホップは 1 つだけのため、Impersonate の偽装レベルのみが必要です。 ただし、スクリプトがリモート システム上の WMI に接続している状態で、追加のリモート システム上でログ ファイルを開こうとすると、そのスクリプトは偽装レベルが Delegate でない限り失敗します。 Delegate 偽装レベルは、複数のネットワーク ホップを伴う操作で必要になります。 WMI での DCOM セキュリティの詳細については、「クライアント アプリケーション プロセス セキュリティの設定」を参照してください。 2 台のコンピューター間のワンネットワーク ホップ接続の詳細については、「リモート コンピューターでの WMI への接続」を参照してください。
委任を使用して別のコンピューターを介してコンピューターに接続するには
ドメイン コントローラーの Active Directory (コントロール パネルの管理タスクの Active Directory ユーザーとコンピューター) で委任を有効にします。 リモート システム上のアカウントは、[委任に対して信頼されています] とマークされている必要があり、ローカル システム上のアカウントは、[アカウントは重要なので委任できません] とマークされている必要があります。 ローカル システム、リモート システム、およびドメイン コントローラーは、同じドメインまたは信頼されたドメインのメンバーである必要があります。
注 委任を使用すると、直接制御できないプロセスに資格情報を使用する権限が与えられるため、セキュリティ リスクが生じます。
委任を使用することを示すには、次の方法でコードを変更します。
-
PowerShell
-
WMI コマンドレットの -Impersonation パラメーターを Delegate に設定します。
-
VBScript
-
impersonationLevel パラメータを、SWbemLocator.ConnectServer の呼び出しで Delegate に設定するか、モニカー文字列で Delegate を設定します。 SWbemSecurity オブジェクトで偽装を設定することもできます。
-
C++
-
偽装レベル パラメーターを、CoInitializeSecurity または CoSetProxyBlanket の呼び出しで RPC_C_IMP_LEVEL_DELEGATE に設定します。 これらの呼び出しを行うタイミングの詳細については、「WMI アプリケーションの COM の初期化」を参照してください。
C++ のリモート COM サーバーにクライアント ID を渡すには、CoSetProxyBlanket の呼び出しでクローキングを設定します。 詳細については、「クローキング」を参照してください。
-
例
次のコード例は、偽装を Delegate に設定するモニカー文字列を示しています。 権限を Kerberos に設定する必要があることに注意してください。
set objWMIServices = Getobject("winmgmts:{impersonationLevel=Delegate,authority=kerberos:MyDomain\Computer_B}!\\ComputerB\Root\CIMv2")
次のコード例では、SWbemLocator.ConnectServer を使用して Delegate (値 4) に偽装を設定する方法を示します。
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer(Computer_B, _
"Root\CIMv2", _
AdminAccount, _
MyPassword, _
"kerberos:Domain\Computer_B")
objWMIService.Security_.ImpersonationLevel = 4
関連トピック