VBScript での非同期呼び出しでのセキュリティの設定

"半同期" 呼び出しのパフォーマンスは通常、ほとんどの状況に適しています。 一般的に、非同期呼び出しはスクリプトに推奨される方法ではありません。 ただし、非同期呼び出しを行う必要がある場合は、レジストリ値を設定して、WMI が非同期呼び出しに対してアクセス チェックを実行するように強制できます。

HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault レジストリ値は、非同期呼び出しのデータが返されるときに、許容される認証レベルを WMI でチェックするかどうかを制御します。 コールバックは、元の非同期呼び出しよりも低い認証レベルで返すことができます。 既定では、コールバックがチェックされないように、この値は 0 に設定されます。 スクリプトで非同期呼び出しをセキュリティで保護するには、レジストリ キーを 1 に設定する必要があります。

スクリプトでは、レジストリ オブジェクト StdRegProvGetStringValue メソッドと SetStringValue メソッドを使用して、UnsecAppAccessControlDefault レジストリ値の設定を変更できます。 リモート アクセスに必要な認証レベルと偽装レベルの詳細については、「リモート コンピューター上の WMI への接続」を参照してください。

VBScript で非同期呼び出しのセキュリティを設定するには

次の VBScript コード例は、コールバックの WMI 認証を制御するためにレジストリ値を変更する方法を示しています。

このスクリプトでは、UnsecAppAccessControlDefault の値を 0 から 1 に変更するか、値が既に設定されている場合は 1 から 0 に変更します。 0 は、新しくインストールされたシステムの既定値です。 フラグが設定されると、再起動または 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)