使用 WMI 进行委派

在从远程系统获取数据的本地系统上运行脚本时,WMI 会将凭据提供给远程系统上数据的提供程序。 这只需要模拟级别的“模拟”,因为只需要一个网络跃点。 但是,如果脚本连接到远程系统上的 WMI 并尝试打开其他远程系统上的日志文件,则脚本将失败,除非模拟级别为“委派”。 涉及多个网络跃点的任何操作都需要委派模拟级别。 有关 WMI 中 DCOM 安全性的详细信息,请参阅设置客户端应用程序进程安全性。 有关两台计算机之间的单网络跃点连接的详细信息,请参阅连接到远程计算机上的 WMI

使用委派通过另一台计算机连接到计算机

  1. 在域控制器上的 Active Directory(控制面板管理任务中的“Active Directory 用户和计算机”)中启用委派。 对于委派,远程系统上的帐户必须标记为“信任它,可以被委派”,并且本地系统上的帐户不得标记为“敏感帐户,不能被委派”。 本地系统、远程系统和域控制器必须是同一域或受信任域中的成员。

    注意 使用委派存在安全风险,因为它使直接控制范围之外的进程能够使用凭据。

  2. 使用以下方式修改代码,以指示要使用委派。

    PowerShell

    将 WMI cmdlet 上的“-Impersonation”参数设置为“委派”。

    VBScript

    在对 SWbemLocator.ConnectServer 的调用中将“impersonationLevel”参数设置为“委派”,或在名字对象字符串中设置为“委派”。 还可以在 SWbemSecurity对象中设置模拟。

    C++

    在调用 CoInitializeSecurityCoSetProxyBlanket 时,将模拟级别参数设置为 RPC_C_IMP_LEVEL_DELEGATE。 有关何时进行这些调用的详细信息,请参阅初始化 WMI 应用程序的 COM

    若要在 C++ 中将客户端标识传递到远程 COM 服务器,请在对 CoSetProxyBlanket 的调用中设置掩蔽。 有关详细信息,请参阅掩蔽

示例

以下代码示例演示一个名字对象字符串,该字符串将模拟设置为“委派”。 请注意,权限必须设置为 Kerberos。

set objWMIServices = Getobject("winmgmts:{impersonationLevel=Delegate,authority=kerberos:MyDomain\Computer_B}!\\ComputerB\Root\CIMv2")

以下代码示例演示如何使用 SWbemLocator.ConnectServer 将模拟设置为 “委派”(值为 4)。

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer(Computer_B, _
                                             "Root\CIMv2", _
                                             AdminAccount, _
                                             MyPassword, _
                                             "kerberos:Domain\Computer_B")
objWMIService.Security_.ImpersonationLevel = 4

保护远程 WMI 连接

使用 WMI 远程创建进程