在 VBScript 中设置异步调用的安全性

半同步调用的性能通常足以满足大多数情况。 对于脚本,通常不建议使用异步调用。 但是,如果必须进行异步调用,可设置注册表值,强制 WMI 对异步调用执行访问检查。

HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault 注册表值控制 WMI 在为异步调用返回数据时是否检查可接受的身份验证级别。 可在比原始异步调用更低的身份验证级别返回回调。 默认情况下,此值设置为零,因此不会检查回调。 要保护脚本中的异步调用,必须将注册表项设置为 1(一)。

脚本可以使用注册表对象 StdRegProvGetStringValueSetStringValue 方法来更改 UnsecAppAccessControlDefault 注册表值的设置。 若要详细了解远程访问所需的身份验证和模拟级别,请参阅连接到远程计算机上的 WMI

在 VBScript 中设置异步调用安全性

以下 VBScript 代码示例演示了如何更改注册表值以控制回调的 WMI 身份验证。

该脚本将 UnsecAppAccessControlDefault 的值从 0 更改为 1;如果该值已设置,则从 1 更改为 0。 新安装的系统上的默认值是零。 一旦设置了标志,那么在重新启动或 WMI 重启期间,该设置持续存在。

该脚本使用 SWbemMethod.InParameters 对象和 SWbemObject.ExecMethod 来调用 StdRegProv.GetStringValue StdRegProv.SetStringValue。 若要详细了解如何在 InParameters 对象中设置值,请参阅构造 InParameters 对象并分析 OutParameters 对象。 有关使用 GetObject 的注册表调用示例,请参阅 StdRegProv.SetStringValue

' Registry key value in hex
Const hklm = &h800000002  
' Subkey string 
Const Subkey = "software\\microsoft\\wbem\\cimom" 
' Asynchronous access control
Const sValueName = "UnsecAppAccessControlDefault" 

' Obtain registry object
Set objReg = GetObject("winmgmts:root\default:StdRegProv") 

' Get the initial value of the asynchronous 
'   access control registry key
' Use an InParameters object to set up the 
'   parameters for the ExecMethod call
' For more information see Constructing InParameters Objects 
'   topic and SWbemObject.ExecMethod_ topic

Set InParams = objReg.methods_("GetStringValue").InParameters.SpawnInstance_
InParams.hDefKey = hklm
InParams.sSubKeyName = Subkey
InParams.sValueName = sValueName

' Get return value from OutParameters object returned by ExecMethod. 
' For more information see Parsing OutParameters Objects topic

Set OutParams = objReg.Execmethod_("GetStringValue",InParams)

If (OutParams.ReturnValue <> 0) then
   Wscript.Echo "GetStringValue returned " & OutParams.ReturnValue
   Wscript.Quit 1
End If

Svalue = OutParams.sValue
If (sValue = 0) Then
   AccessControl = "WMI not performing asynch access control"
Else 
   AccessControl = "WMI performing asynch access control"  
End If
Wscript.Echo sValueName & " = " _
    & sValue & VBNewLine & AccessControl

' Change asynchronous access control registry key value
Set InParams = objReg.methods_("SetStringValue").InParameters.SpawnInstance_

InParams.hDefKey = hklm
InParams.sSubKeyName = Subkey
InParams.sValueName = sValueName
InParams.sValue = sValue XOR 1

Set OutParams = objReg.ExecMethod_("SetStringValue",InParams)

If (OutParams.Returnvalue <> 0) Then
    Wscript.Echo "SetStringValue returned " & OutParams.Returnvalue
    Wscript.Quit 1
End If

Wscript.Echo SValueName & " changed to " & (sValue XOR 1)