使用 WMI 进行委托

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

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

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

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

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

    PowerShell

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

    VBScript

    在调用 SWbemLocator.ConnectServermoniker 字符串中的 Delegate 时,将 impersonationLevel 参数设置为 Delegate。 还可以在 SWbemSecurity 对象中设置模拟。

    C++

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

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

示例

下面的代码示例显示了将模拟设置为 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

保护远程 WMI 连接

使用 WMI 远程创建进程