脚本可以使用默认的 WMI 身份验证和模拟设置。 但是,脚本可能需要具有更多安全性的连接,或者可能连接到需要加密连接的命名空间。 有关详细信息,请参阅 设置命名空间安全描述符 和 要求与命名空间建立加密连接。
最简单的情况是,脚本可以使用默认身份验证和模拟设置。 WMI 通常在共享服务主机中运行,并且与主机中的其他进程共享相同的身份验证。 如果要使用不同级别的身份验证运行 WMI 进程,请使用 winmgmt 命令并加上 /standalonehost 开关运行 WMI,然后通常设置 WMI 的身份验证级别。 有关详细信息,请参阅 维护 WMI 安全性。
以下脚本对模拟和身份验证级别使用默认设置。
strComputer = "."
Set objServices = GetObject("winmgmts:\\" _
& strComputer & "\root\CIMV2")
set objProcessSet = objServices.ExecQuery _
("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
还可以在调用 GetObject 时使用名称,并设置默认的安全设置,如以下示例所示。
strComputer = "."
Set objServices = GetObject( _
"winmgmts:{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!root/cimv2")
set objProcessSet = objServices.ExecQuery _
("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
有关在脚本中设置不同模拟或身份验证级别或设置计算机默认值的详细信息,请参阅以下主题:
- 使用 VBScript 更改默认身份验证凭据
- 使用 VBScript 更改默认模拟设置
- 使用注册表设置默认模拟级别
- 访问 VBScript 中的 SWbemSecurity 对象
- SWbemSecurity
使用 VBScript 更改默认身份验证凭据
可以使用 名字对象 字符串,以及 SWbemLocator 和 SWbemSecurity 对象,在脚本中更改身份验证级别。
必须根据要连接到的目标操作系统的要求设置身份验证级别。 有关详细信息,请参阅 “在不同操作系统之间的连接”。
以下 VBScript 代码示例演示如何更改从名为“Server1”的远程计算机获取可用空间数据的脚本中的身份验证级别。
strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{authenticationLevel=Pkt}!\\" _
& strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
"FreeSpace: " & vbTab & objDisk.FreeSpace
NextstrComputer = "."
Set objServices = GetObject( "winmgmts:{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!root/cimv2")
Set objProcessSet = objServices.ExecQuery("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
Next
在与 WMI 的脚本名字对象连接中,请使用下表的“名字对象名称/说明”列中显示的短名称。 例如,在以下脚本中,身份验证级别设置为 WbemAuthenticationLevelPktIntegrity。
SetobjWMIService = GetObject( _
"winmgmts:{authenticationLevel=pktPrivacy}!root\cimv2")
下表列出了可以设置的身份验证级别。 这些级别在枚举 WbemAuthenticationLevelEnum 的 Wbemdisp.tlb 中定义。
名称/值 | DESCRIPTION |
---|---|
WbemAuthenticationLevelDefault 0 |
标签:默认 WMI 使用默认的 Windows 身份验证设置。 这是允许 WMI 协商到服务器返回数据所需的级别的建议设置。 但是,如果命名空间需要加密,请使用 WbemAuthenticationLevelPktPrivacy。 |
WbemAuthenticationLevelNone 1 |
名字对象:无 不使用身份验证。 |
WbemAuthenticationLevelConnect 2 |
名字对象:连接 仅当客户端与服务器建立关系时,才对客户端的凭据进行身份验证。 |
WbemAuthenticationLevelCall 3 |
打电话 仅在服务器收到请求时在每个调用开始时进行身份验证。 |
WbemAuthenticationLevelPkt 4 |
别名:Pkt 验证接收的所有数据是否来自预期的客户端。 |
WbemAuthenticationLevelPktIntegrity 5 |
名称:PktIntegrity 认证并验证在客户端和服务器之间传输的任何数据均未被修改。 |
WbemAuthenticationLevelPktPrivacy 6 |
名称:PktPrivacy 对所有以前的模拟级别进行身份验证,并加密每个远程过程调用的参数值。 如果要连接到的命名空间需要加密连接,请使用此设置。 |
若要确定成功的调用,请在更改身份验证级别后检查返回值。
例如,由于本地连接始终具有 wbemAuthenticationLevelPktPrivacy 的身份验证级别,因此以下示例无法设置身份验证级别,因为它连接到本地计算机。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!" _
& "\\" & strComputer & "\root\cimv2")
提供程序可以在命名空间上设置安全性,以便除非在与该命名空间的连接中使用数据包隐私(PktPrivacy),否则不会返回任何数据。 这可确保数据在跨网络时进行加密。 如果尝试设置较低的身份验证级别,将收到拒绝访问的消息。 有关详细信息,请参阅 保护 WMI 命名空间。
使用 VBScript 更改默认模拟级别
对 WMI 的脚本 API 进行调用时,建议使用 WMI 为模拟级别提供的默认值。 远程调用和具有多个网络跃点的某些提供程序需要比 WMI 使用的更高的模拟级别。 如果模拟级别不够,提供程序可能会拒绝请求或提供不完整的信息。
如果未在名字对象中设置模拟级别,或者通过在安全对象上设置 SWbemSecurity.ImpersonationLevel,则为操作系统设置默认的 DCOM 模拟级别。 必须根据要连接到的目标作系统的要求设置模拟级别。 有关详细信息,请参阅 “在不同操作系统之间连接”。
以下 VBScript 代码示例演示如何更改上面所示的同一脚本中的模拟级别。
strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
"FreeSpace: " & vbTab & objDisk.FreeSpace
Next
下表列出了所使用的 WbemImpersonationLevelEnum 中的身份验证级别。
名称/值 | DESCRIPTION |
---|---|
wbemImpersonationLevelAnonymous 1 |
昵称:匿名 隐藏调用方凭据。 在此模拟级别下,对 WMI 的调用可能会失败。 |
wbemImpersonationLevelIdentify 2 |
标识符:识别 允许对象查询调用方凭据。 调用 WMI 可能会由于此模拟级别而失败。 |
wbemImpersonationLevelImpersonate 3 |
标识符:身份仿冒 允许对象使用调用方凭据。 建议用于 WMI 调用的脚本 API 的模拟级别是这个。 |
wbemImpersonationLevelDelegate 4 |
名字对象:委托 允许对象允许其他对象使用调用方凭据。 此模拟适用于 WMI 调用的脚本 API,但可能构成不必要的安全风险。 |
以下示例演示如何在获取特定 Win32_Process 实例时在 Moniker 字符串中设置模拟身份。
Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")
有关详细信息,请参阅 创建 WMI 应用程序或脚本。
使用注册表设置默认模拟级别
如果有权访问注册表,还可以设置默认模拟级别注册表项。 此键指定 WMI 脚本 API 使用的模拟级别,除非另有指定。 以下路径标识注册表路径。
\ HKEY_LOCAL_MACHINE软件\\ MicrosoftWBEM\脚本\默认模拟级别
默认情况下,注册表项设置为 3,指定模拟模拟级别。 某些提供程序可能需要更高级别的模拟。
访问 VBScript 中的 SWbemSecurity 对象
设置模拟级别的另一方法是通过 SWbemSecurity 安全对象来实现,该安全对象作为 SWbemServices、SWbemObject、SWbemObjectSet、SWbemEventSource、SWbemObjectPath 和 SwbemLocator 对象的 Security_ 属性出现。
WMI 将父对象的安全设置传递给原始对象的后代。 因此,可以在登录到 WMI 和进行 API 调用之后,设置 SWbemServices 对象的模拟级别,或使用该对象或从中创建的对象(例如 SWbemObject 类型的对象)。