共用方式為


在 VBScript 中的異步呼叫上設定安全性

半異步 呼叫的效能通常適用於大部分情況。 異步呼叫通常不是程式碼的建議做法。 不過,如果必須進行異步呼叫,可以將登錄值設定為強制 WMI 在異步呼叫上執行存取檢查。

HKEY_LOCAL_MACHINE\軟體\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault 登錄值可控制 WMI 在傳回異步呼叫數據時是否檢查可接受的驗證層級。 回呼函數可以在比原始異步呼叫更低的驗證層級下傳回。 根據預設,此值會設定為零,因此不會檢查回呼。 若要保護腳本中的異步呼叫,您必須將登錄機碼設定為1(一個)。

腳本可以使用登錄物件的 GetStringValueSetStringValue 方法,StdRegProv 來變更登錄值 UnsecAppAccessControlDefault 登錄值的設定。 如需有關遠端訪問所需的驗證和模擬層級的更多資訊,請參閱如何連線到遠端電腦上的 WMI

在 VBScript 中設定異步呼叫安全性

下列 VBScript 程式代碼範例示範如何變更登錄值來控制回呼的 WMI 驗證。

腳本會將 UnsecAppAccessControlDefault 的值從零變更為一,或者如果值已經設定,則從一個變更為零。 零是新安裝系統上的預設值。 設定旗標之後,設定會在重新啟動或WMI重新啟動時持續存在。

腳本會使用 SWbemMethod.InParameters 物件和 SWbemObject.ExecMethod 呼叫 StdRegProv.GetStringValueStdRegProv.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)