システム レジストリ イベントの登録
システム レジストリ プロバイダーから通知を受信するには、管理アプリケーションを一時イベント コンシューマーとして登録する必要があります。 システム レジストリ プロバイダーに登録するための要件のほとんどは、次の手順を実行する必要があることを除いて、他のイベント登録と同じです。
レジストリ プロバイダーは、システム レジストリ内のイベントのイベント クラスを提供します。 一般的なイベント登録の詳細については、「WMI イベントの受信」を参照してください。
次の手順では、システム レジストリ イベントに登録する方法について説明します。
システム レジストリ イベントを登録するには
通知クエリ メソッドを呼び出します。
スクリプトまたは C++ のいずれかで、SWbemServices.ExecNotificationQueryAsync や IWbemServices::ExecNotificationQueryAsync などの通知クエリを使用します。 スクリプトで IWbemServices::ExecNotificationQueryAsync または strQuery の bstrQuery パラメーターのクエリ文字列を作成します。
受信するイベントの種類を決定し、クエリを作成します。
次の表に、使用できるレジストリ イベント クラスを示します。
イベント クラス Hive の場所 説明 RegistryEvent 該当なし レジストリの変更のための抽象基本クラス。 RegistryTreeChangeEvent RootPath キーの階層への変更を監視します。 RegistryKeyChangeEvent KeyPath 1 つのキーへの変更を監視します。 RegistryValueChangeEvent ValueName 1 つの値への変更を監視します。 これらのクラスには、変更を監視するキーの階層 (HKEY_LOCAL_MACHINE など) を識別する Hive と呼ばれるプロパティがあります。
HKEY_CLASSES_ROOT および HKEY_CURRENT_USER ハイブの変更は、RegistryEvent またはそこから派生したクラス (RegistryTreeChangeEvent など) ではサポートされていません。
イベント登録用の WHERE 句を作成します。
システム レジストリ プロバイダーには、WHERE 句の特定の規則があります。 詳細については、「レジストリ プロバイダーの適切な WHERE 句の作成」を参照してください。 WHERE 句の作成に関する一般的な情報については、「WQL を使用したクエリ」を参照してください。
コンシューマーがイベントを受信しているかどうかを確認します。
システム レジストリ プロバイダーでは、送信されたすべてのイベントが配信されるとは限りません。 詳細については、「レジストリ イベントを受信する」を参照してください。
次の 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