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)