Настройка безопасности при асинхронном вызове в 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)