在 VBScript 中設定非同步呼叫的安全性

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

HKEY_LOCAL_MACHINE\Software\Microsoft\WBEMCIMOM\\UnsecAppAccessControlDefault登錄值可控制 WMI 是否在傳回非同步呼叫的資料時檢查可接受的驗證層級。 回呼可以傳回的驗證層級低於原始非同步呼叫的層級。 根據預設,此值會設定為零,因此不會檢查回呼。 若要保護腳本中的非同步呼叫,您必須將登錄機碼設定為 1 (一) 。

腳本可以使用登錄物件 StdRegProvGetStringValueSetStringValue方法來變更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)