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

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

Значение реестраUnsecAppAccessControlDefaultHKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\ определяет, проверяет ли 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)