在 VBScript 中設定非同步呼叫的安全性
半同步呼叫的效能通常適用于大部分的情況。 非同步呼叫通常不是腳本的建議做法。 不過,如果必須進行非同步呼叫,可以將登錄值設定為強制 WMI 在非同步呼叫上執行存取檢查。
HKEY_LOCAL_MACHINE\Software\Microsoft\WBEMCIMOM\\UnsecAppAccessControlDefault登錄值可控制 WMI 是否在傳回非同步呼叫的資料時檢查可接受的驗證層級。 回呼可以傳回的驗證層級低於原始非同步呼叫的層級。 根據預設,此值會設定為零,因此不會檢查回呼。 若要保護腳本中的非同步呼叫,您必須將登錄機碼設定為 1 (一) 。
腳本可以使用登錄物件 StdRegProv的GetStringValue和SetStringValue方法來變更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)