Configurar a segurança em uma chamada assíncrona no VBScript

O desempenho de chamadas semissíncronas geralmente é adequado na maioria das situações. As chamadas assíncronas geralmente não são uma prática recomendada em scripts. No entanto, se chamadas assíncronas precisarem ser feitas, um valor do Registro poderá ser definido para forçar o WMI a executar verificações de acesso em chamadas assíncronas.

O valor do Registro HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault controla se o WMI verifica se há um nível de autenticação aceitável ao retornar dados para uma chamada assíncrona. O retorno de chamada pode ser retornado em um nível de autenticação mais baixo que o da chamada assíncrona original. Por padrão, esse valor é definido como zero para que os retornos de chamada não sejam verificados. Para proteger chamadas assíncronas no script, você deve definir a chave do Registro como 1 (um).

Os scripts podem usar os métodos GetStringValue e SetStringValue do objeto do Registro StdRegProv para alterar a configuração do valor do Registro UnsecAppAccessControlDefault. Para obter mais informações sobre os níveis de autenticação e representação necessários para acesso remoto, veja Conectando-se ao WMI em um computador remoto.

Para definir a segurança da chamada assíncrona no VBScript

O exemplo de código VBScript a seguir mostra como alterar o valor do Registro para controlar a autenticação de retornos de chamada do WMI.

O script altera o valor de UnsecAppAccessControlDefault de zero para um ou, se o valor já estiver definido, de um para zero. Zero é o padrão em um sistema recém-instalado. Depois que o sinalizador é definido, a configuração persiste no reboot ou na reinicialização do WMI.

O script usa um objeto SWbemMethod.InParameters e SWbemObject.ExecMethod para chamar StdRegProv.GetStringValue e StdRegProv.SetStringValue. Para obter mais informações sobre como definir os valores em um objeto InParameters, veja Construir objetos InParameters e analisar objetos OutParameters. Para ver um exemplo de uma chamada do Registro usando GetObject, consulte 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)