次の方法で共有


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

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

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

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

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

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

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