使用 VBScript 设置默认进程安全级别

脚本可以使用默认的 WMI 身份验证和模拟设置。 但是,脚本可能需要更安全的连接,或者可以连接到需要加密连接的命名空间。 有关详细信息,请参阅设置命名空间安全描述符需要与命名空间建立加密连接

在最简单的情况下,脚本可以使用默认的身份验证和模拟设置。 WMI 通常在共享的服务主机中运行,并与主机中的其他进程共享相同的身份验证。 如果你要使用不同的身份验证级别运行 WMI 进程,请使用带有 /standalonehost 开关的 winmgmt 命令运行 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 更改默认身份验证凭据

可以使用名字对象字符串以及 SWbemLocatorSWbemSecurity 对象在脚本中更改身份验证级别。

必须根据要连接的目标操作系统的要求设置身份验证级别。 有关详细信息,请参阅在不同操作系统之间进行连接

以下 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")

下表列出了可以设置的身份验证级别。 这些级别在 Wbemdisp.tlb 的枚举 WbemAuthenticationLevelEnum 中定义。

名称/值 说明
WbemAuthenticationLevelDefault
0
名字对象:Default
WMI 使用默认的 Windows 身份验证设置。 这是建议的设置,它允许 WMI 在服务器返回数据所需的级别进行协商。 但是,如果命名空间需要加密,请使用 WbemAuthenticationLevelPktPrivacy。
WbemAuthenticationLevelNone
1
名字对象:None
不使用身份验证。
WbemAuthenticationLevelConnect
2
名字对象:Connect
仅当客户端与服务器建立关系时,才验证客户端的凭据。
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 中使用的身份验证级别。

名称/值 说明
wbemImpersonationLevelAnonymous
1
名字对象:Anonymous
隐藏调用方的凭据。 在此模拟级别上对 WMI 的调用可能会失败。
wbemImpersonationLevelIdentify
2
名字对象:Identify
允许对象查询调用方的凭据。 在此模拟级别上对 WMI 的调用可能会失败。
wbemImpersonationLevelImpersonate
3
名字对象:Impersonate
允许对象使用调用方的凭据。 这是为适用于 WMI 的脚本 API 调用建议的模拟级别。
wbemImpersonationLevelDelegate
4
名字对象:Delegate
允许对象允许其他对象使用调用方的凭据。 此模拟将与适用于 WMI 的脚本 API 调用一起使用,但可能会带来不必要的安全风险。

以下示例演示在获取 Win32_Process 的特定实例时如何在名字对象字符串中设置模拟。

Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")

有关详细信息,请参阅创建 WMI 应用程序或脚本

使用注册表设置默认模拟级别

如果你有权访问注册表,则还可以设置默认模拟级别注册表项。 除非另有指定,否则此项指定适用于 WMI 的脚本 API 使用的模拟级别。 以下路径标识注册表路径。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Impersonation Level

默认情况下,该注册表项设置为 3,即指定“模拟”模拟级别。 某些提供程序可能需要更高的模拟级别。

在 VBScript 中访问 SWbemSecurity 对象

另一种设置模拟级别的方式是通过 SWbemSecurity 安全对象进行设置,该对象显示为 SWbemServicesSWbemObjectSWbemObjectSetSWbemEventSourceSWbemObjectPathSwbemLocator 对象的 Security_ 属性。

WMI 将父对象的安全设置传递给原始对象的后代。 因此,可以在登录到 WMI 和 API 调用后,使用该对象或从该对象创建的对象(例如类型为 SWbemObject 的对象)设置 SWbemServices 对象的模拟级别。

连接到远程计算机上的 WMI

保护脚本客户端