使用 WMI 进行委托
在从远程系统获取数据的本地系统上运行脚本时,WMI 会将凭据提供给远程系统上数据的提供程序。 这只需要模拟级别的模拟,因为只需要一个网络跃点。 但是,如果脚本连接到远程系统上的 WMI 并尝试打开其他远程系统上的日志文件,则除非模拟级别为委托,否则脚本将失败。 涉及多个网络跃点的任何操作都需要委托模拟级别。 有关 WMI 中 DCOM 安全性的详细信息,请参阅设置客户端应用程序进程安全性。 有关两台计算机之间单跃点连接的详细信息,请参阅 在远程计算机上连接到 WMI。
若要使用委派通过另一台计算机连接到计算机
在域控制器上启用 Active Directory 中的委派(控制面板管理任务中的Active Directory 用户和计算机)。 远程系统上的帐户必须被标记为受信任的委派,本地系统上的帐户不得标记为帐户敏感且无法委派。 本地系统、远程系统和域控制器必须是同一域或受信任域中的成员。
请注意,使用委派会带来安全风险,因为它使直接控制外部的进程能够使用凭据。
使用以下方式修改代码,以表示您要使用委派。
-
PowerShell
-
将 WMI cmdlet 上的 -Impersonation 参数设置为 Delegate。
-
VBScript
-
在调用 SWbemLocator.ConnectServer 或 moniker 字符串中的 Delegate 时,将 impersonationLevel 参数设置为 Delegate。 还可以在 SWbemSecurity 对象中设置模拟。
-
C++
-
在调用 CoInitializeSecurity 或 CoSetProxyBlanket 时,将模拟级别参数设置为 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
相关主题