在 VBScript 中设置异步调用的安全性
半同步调用的性能通常足以满足大多数情况。 对于脚本,通常不建议使用异步调用。 但是,如果必须进行异步调用,可设置注册表值,强制 WMI 对异步调用执行访问检查。
HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault 注册表值控制 WMI 在为异步调用返回数据时是否检查可接受的身份验证级别。 可在比原始异步调用更低的身份验证级别返回回调。 默认情况下,此值设置为零,因此不会检查回调。 要保护脚本中的异步调用,必须将注册表项设置为 1(一)。
脚本可以使用注册表对象 StdRegProv 的 GetStringValue 和 SetStringValue 方法来更改 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)