システム レジストリ イベントの登録

システム レジストリ プロバイダーから通知を受信するには、管理アプリケーションを一時イベント コンシューマーとして登録する必要があります。 システム レジストリ プロバイダーに登録するための要件のほとんどは、次の手順を実行する必要があることを除いて、他のイベント登録と同じです。

レジストリ プロバイダーは、システム レジストリ内のイベントのイベント クラスを提供します。 一般的なイベント登録の詳細については、「WMI イベントの受信」を参照してください。

次の手順では、システム レジストリ イベントに登録する方法について説明します。

システム レジストリ イベントを登録するには

  1. 通知クエリ メソッドを呼び出します。

    スクリプトまたは C++ のいずれかで、SWbemServices.ExecNotificationQueryAsyncIWbemServices::ExecNotificationQueryAsync などの通知クエリを使用します。 スクリプトで IWbemServices::ExecNotificationQueryAsync または strQuerybstrQuery パラメーターのクエリ文字列を作成します。

  2. 受信するイベントの種類を決定し、クエリを作成します。

    次の表に、使用できるレジストリ イベント クラスを示します。

    イベント クラス Hive の場所 説明
    RegistryEvent 該当なし
    レジストリの変更のための抽象基本クラス。
    RegistryTreeChangeEvent RootPath
    キーの階層への変更を監視します。
    RegistryKeyChangeEvent KeyPath
    1 つのキーへの変更を監視します。
    RegistryValueChangeEvent ValueName
    1 つの値への変更を監視します。

    これらのクラスには、変更を監視するキーの階層 (HKEY_LOCAL_MACHINE など) を識別する Hive と呼ばれるプロパティがあります。

    HKEY_CLASSES_ROOT および HKEY_CURRENT_USER ハイブの変更は、RegistryEvent またはそこから派生したクラス (RegistryTreeChangeEvent など) ではサポートされていません。

  3. イベント登録用の WHERE 句を作成します。

    システム レジストリ プロバイダーには、WHERE 句の特定の規則があります。 詳細については、「レジストリ プロバイダーの適切な WHERE 句の作成」を参照してください。 WHERE 句の作成に関する一般的な情報については、「WQL を使用したクエリ」を参照してください。

  4. コンシューマーがイベントを受信しているかどうかを確認します。

    システム レジストリ プロバイダーでは、送信されたすべてのイベントが配信されるとは限りません。 詳細については、「レジストリ イベントを受信する」を参照してください。

次の VBScript コード例は、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft ハイブまたはサブツリーでレジストリの変更を検出する方法を示しています。 これは監視スクリプトであり、デモ目的で、タスク マネージャーで終了するか、WMI が停止するか、オペレーティング システムが再起動されるまで、Wscript.exe という名前のプロセスで実行されます。 このスクリプトでは、SWbemServices.ExecNotificationQuery半同期呼び出しを使用します。 半同期呼び出しの詳細については、「VBScript を使用して半同期呼び出しを行う」を参照してください。

Set wmiServices = GetObject("winmgmts:root/default") 
Set colTreeChanges = wmiServices.ExecNotificationQuery _
    ("SELECT * FROM RegistryTreeChangeEvent " _
    & "WHERE Hive='HKEY_LOCAL_MACHINE' " _
    & "AND RootPath='SOFTWARE\\Microsoft'")

While (True)
   Set TreeChange = colTreeChanges.NextEvent
   TreeChange.GetObjectText_()
   Wscript.Echo  "Hive = " & TreeChange.Hive & VBNewLine _
      & "RootPath = "& TreeChange.RootPath _
      & TreeChange.GetObjectText_()      
Wend

次の VBScript コード例は、レジストリ プロバイダーのイベントの種類 RegistryKeyChangeEvent に登録することで、キーの値の変更を監視する方法を示しています。 このスクリプトは、非同期メソッド SWbemServices.ExecNotificationQueryAsync を呼び出します。 非同期呼び出しとセキュリティの詳細については、「VBScript を使用して非同期呼び出しを行う」を参照してください。

次のスクリプトは、コンピューターが再起動されるか、WMI が停止されるか、スクリプトが停止されるまで無期限に実行されます。 スクリプトを手動で停止するには、タスク マネージャーを使用してプロセスを停止します。 プログラムで停止するには、Win32_Process クラスの Terminate メソッドを使用します。

strComputer = "."
Set objWMIServices = GetObject("winmgmts:root/default") 
Set wmiSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink", "SINK_") 
Set ObjRegistry = GetObject("winmgmts:_
    {impersonationLevel = impersonate}!\\" _
    & strComputer & "\root\default:StdRegProv")

' Create a new key
strPath = "SOFTWARE\MyKey\MySubKey\"
Return = objRegistry.CreateKey(HKEY_LOCAL_MACHINE, strPath)

' Start listening for change in key
objWMIServices.ExecNotificationQueryAsync wmiSink, _ 
    "SELECT * FROM RegistryKeyChangeEvent " _ 
    & "WHERE Hive='HKEY_LOCAL_MACHINE' AND " _ 
    & "KeyPath='SOFTWARE\\MyKey\\MySubKey\\'" 
WScript.Echo "Listening for Registry Change Events..." 

While(True) 
    WScript.Sleep 1000
' You can use Regedit to make a change in the key 
' HKEY_LOCAL_MACHINE\SOFTWARE\MyKey\MySubKey\ 
'    to see an event generated.
Wend 

Sub SINK_OnObjectReady(EventObject, wmiAsyncContext) 
    WScript.Echo "Received Registry Change Event" & vbCrLf & _
      EventObject.GetObjectText_() 
End Sub