Поделиться через


Настройка безопасности для асинхронного вызова в VBScript

Производительность полусинхронных вызововобычно адекватна для большинства ситуаций. Асинхронные вызовы обычно не являются рекомендуемой практикой для сценариев. Однако если необходимо выполнить асинхронные вызовы, можно задать значение реестра, чтобы принудить WMI выполнять проверку доступа для асинхронных вызовов.

HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault значение реестра определяет, проверяет ли WMI допустимый уровень аутентификации при возвращении данных для асинхронного вызова. Обратный вызов можно вернуть на более низком уровне проверки подлинности, чем в исходном асинхронном вызове. По умолчанию это значение равно нулю, чтобы обратные вызовы не проверялись. Чтобы защитить асинхронные вызовы в скрипте, необходимо задать для ключа реестра значение 1 (один).

Скрипты могут использовать методы GetStringValue и SetStringValue объекта реестра StdRegProv для изменения параметра значения реестра UnsecAppAccessControlDefault. Дополнительные сведения о уровнях проверки подлинности и олицетворения, необходимых для удаленного доступа, см. в подключении к WMI на удаленном компьютере.

Настройка безопасности асинхронного вызова в VBScript

В следующем примере кода VBScript показано, как изменить значение реестра для управления проверкой подлинности WMI обратных вызовов.

Скрипт изменяет значение UnsecAppAccessControlDefault от нуля до одного или если значение уже задано с одного до нуля. Ноль — это значение по умолчанию для только что установленной системы. После установки флага параметр сохраняется во время перезагрузки или перезапуска WMI.

Скрипт использует объект SWbemMethod.InParameters и SWbemObject.ExecMethod для вызова StdRegProv.GetStringValue и StdRegProv.SetStringValue. Дополнительные сведения о настройке значений в объекте InParameters см. в разделе о создании объектов InParameters и анализе объектов OutParameters. Пример вызова реестра с помощью GetObjectсм. в разделе 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)