Partilhar via


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

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

O valor do registo HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault controla se o WMI verifica um nível de autenticação aceitável ao retornar dados para uma chamada assíncrona. O callback pode ocorrer num nível de autenticação inferior ao 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 em scripts, você deve definir a chave do Registro como 1 (uma).

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

Para definir a segurança de 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 WMI de retornos de chamada.

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. Uma vez que o sinalizador esteja definido, a configuração persiste ao longo da reinicialização ou reinício 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, consulte Constructing InParameters Objects e Parsing OutParameters Objects. Para obter 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)