使用 WMI 委派

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

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

  1. 在域控制器上的 控制面板Administrative Tasks) 中启用 Active Directory (Active Directory 用户和计算机委派。 远程系统上的帐户必须标记为 “受信任的委派 ”,本地系统上的帐户不得标记为 “帐户”敏感且无法委派。 本地系统、远程系统和域控制器必须是同一域或受信任域中的成员。

    注意 使用委派是一种安全风险,因为它使直接控制外部的进程能够使用凭据。

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

    PowerShell

    将 WMI cmdlet 上的 -Impersonation 参数设置为 Delegate

    VBScript

    模拟Level参数设置为在 调用 SWbemLocator.ConnectServerDelegatein名字对象 字符串中委托。 还可以在 SWbemSecurityobject 中设置模拟。

    C++

    将模拟级别参数设置为在调用 CoInitializeSecurityCoSetProxyBlanketRPC_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 远程创建进程