Establecer la seguridad en una llamada asincrónica en VBScript
El rendimiento de las llamadas semisincrónicas suele ser adecuado para la mayoría de las situaciones. Por lo general, las llamadas asincrónicas no son una práctica recomendada para los scripts. Sin embargo, si deben realizarse llamadas asíncronas, puede establecerse un valor de registro para obligar a WMI a realizar comprobaciones de acceso en las llamadas asíncronas.
El valor de registro HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault controla si WMI comprueba un nivel de autenticación aceptable al devolver datos para una llamada asíncrona. La devolución de llamada se puede devolver en un nivel de autenticación inferior al de la llamada asincrónica original. De forma predeterminada, este valor se establece en cero para que no se comprueben las devoluciones de llamada. Para proteger las llamadas asíncronas en el scripting, debe establecer la clave del registro en 1 (uno).
Los scripts pueden utilizar los métodos GetStringValue y SetStringValue del objeto de registro StdRegProv para cambiar la configuración del valor de registro UnsecAppAccessControlDefault. Para obtener más información sobre los niveles de autenticación y suplantación necesarios para el acceso remoto, consulte Conexión a WMI en un equipo remoto.
Para establecer la seguridad de llamadas asincrónicas en VBScript
En el siguiente ejemplo de código de VBScript se muestra cómo cambiar el valor del Registro para controlar la autenticación WMI de devoluciones de llamada.
El script cambia el valor de UnsecAppAccessControlDefault de cero a uno, o si el valor ya está establecido, de uno a cero. Cero es el valor predeterminado en un sistema recién instalado. Una vez establecida la marca, la configuración persiste en el reinicio o en el reinicio de WMI.
El script usa un objeto SWbemMethod.InParameters y SWbemObject.ExecMethod para llamar a StdRegProv.GetStringValue y StdRegProv.SetStringValue. Para obtener más información sobre cómo establecer los valores de un objeto InParameters, vea Construcción de objetos InParameters y análisis sintáctico de objetos OutParameters. Para obtener un ejemplo de una llamada al Registro mediante GetObject, vea 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)