Festlegen der Sicherheit für einen asynchronen Aufruf in VBScript

Die Leistung halbsynchroner Aufrufe ist in der Regel für die meisten Situationen ausreichend. Asynchrone Aufrufe werden für Skripts im Allgemeinen nicht empfohlen. Wenn jedoch asynchrone Aufrufe ausgeführt werden müssen, kann ein Registrierungswert festgelegt werden, um WMI zu zwingen, Zugriffsprüfungen für asynchrone Aufrufe durchzuführen.

Der Registrierungswert HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault steuert, ob WMI bei der Rückgabe von Daten für einen asynchronen Aufruf auf eine akzeptable Authentifizierungsebene überprüft. Der Rückruf kann auf einer niedrigeren Authentifizierungsebene als der des ursprünglichen asynchronen Aufrufs zurückgegeben werden. Standardmäßig ist dieser Wert auf 0 festgelegt, sodass Rückrufe nicht überprüft werden. Um asynchrone Aufrufe bei der Skripterstellung zu schützen, müssen Sie den Registrierungsschlüssel auf „1“ (eins) festlegen.

Skripts können die Methoden GetStringValue und SetStringValue des Registrierungsobjekts StdRegProv verwenden, um die Einstellung des Registrierungswerts UnsecAppAccessControlDefault zu ändern. Weitere Informationen zu Authentifizierungs- und Identitätswechselebenen, die für den Remotezugriff erforderlich sind, finden Sie unter Herstellen einer Verbindung mit WMI auf einem Remotecomputer.

So legen Sie die Sicherheit für asynchrone Aufrufe in VBScript fest

Im folgenden VBScript-Codebeispiel wird gezeigt, wie Sie den Registrierungswert ändern, um die WMI-Authentifizierung von Rückrufen zu steuern.

Das Skript ändert den UnsecAppAccessControlDefault-Wert von 0 (null) in 1 oder, wenn der Wert bereits festgelegt ist, von 1 in 0 (null). Null ist die Standardeinstellung in einem neu installierten System. Sobald das Flag festgelegt ist, wird die Einstellung über einen Neustart oder WMI-Neustart hinweg beibehalten.

Das Skript verwendet ein SWbemMethod.InParameters-Objekt und SWbemObject.ExecMethod, um StdRegProv.GetStringValue und StdRegProv.SetStringValue aufzurufen. Weitere Informationen zum Festlegen der Werte in einem InParameters-Objekt finden Sie unter Erstellen von InParameters-Objekten und Analysieren von OutParameters-Objekten. Ein Beispiel für einen Registrierungsaufruf mit GetObject finden Sie unter 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)