Registrieren für Systemregistrierungsereignisse

Zum Empfang von Benachrichtigungen vom Systemregistrierungsanbieter muss sich eine Verwaltungsanwendung als temporärer Ereignisconsumer registrieren. Die meisten Anforderungen zur Registrierung für den Systemregistrierungsanbieter entsprechen denen jeder anderen Ereignisregistrierung – mit der Ausnahme, dass Sie auch das folgende Verfahren durchführen müssen.

Der Registrierungsanbieter stellt Ereignisklassen für Ereignisse in der Systemregistrierung bereit. Weitere Informationen zur allgemeinen Ereignisregistrierung finden Sie unter Empfangen eines WMI-Ereignisses.

Nachfolgend wird beschrieben, wie Sie sich für Ereignisse in der Systemregistrierung registrieren.

So registrieren Sie sich für Systemregistrierungsereignisse

  1. Rufen Sie eine Methode zur Benachrichtigungsabfrage auf.

    Verwenden Sie entweder in Skripts oder C++ eine Benachrichtigungsabfrage wie SWbemServices.ExecNotificationQueryAsync oder IWbemServices::ExecNotificationQueryAsync. Erstellen Sie einen Abfragezeichenfolge für den bstrQuery-Parameter von IWbemServices::ExecNotificationQueryAsync oder den strQuery-Parameter im Skript.

  2. Bestimmen Sie, welchen Ereignistyp Sie empfangen möchten, und erstellen Sie die Abfrage.

    In der folgenden Tabelle werden die Ereignisklassen der Registrierung aufgeführt, die Sie verwenden können.

    Ereignisklasse Standort in der Struktur BESCHREIBUNG
    RegistryEvent
    Abstrakte Basisklasse für Änderungen in der Registrierung.
    RegistryTreeChangeEvent RootPath
    Überwacht Änderungen an einer Schlüsselhierarchie.
    RegistryKeyChangeEvent KeyPath
    Überwacht Änderungen an einem einzelnen Schlüssel.
    RegistryValueChangeEvent ValueName
    Überwacht Änderungen an einem einzelnen Wert.

    Diese Klassen verfügen über eine Eigenschaft namens Hive, die die Hierarchie der Schlüssel identifiziert, die auf Änderungen überwacht werden sollen (z. B. HKEY_LOCAL_MACHINE).

    Änderungen an den Strukturen HKEY_CLASSES_ROOT und HKEY_CURRENT_USER werden von RegistryEvent oder davon abgeleiteten Klassen (z. B. RegistryTreeChangeEvent) nicht unterstützt.

  3. Erstellen Sie die WHERE-Klausel für Ihre Ereignisregistrierung.

    Der Systemregistrierungsanbieter verfügt über spezifische Regeln für WHERE-Klauseln. Weitere Informationen finden Sie unter Erstellen einer WHERE-Klausel für den Registrierungsanbieter. Weitere allgemeine Informationen zum Erstellen einer WHERE-Klausel finden Sie unter Abfragen mit WQL.

  4. Bestimmen Sie, ob Ihr Consumer Ereignisse empfängt.

    Der Systemregistrierungsanbieter garantiert nicht, dass alle gesendeten Ereignisse übermittelt werden. Weitere Informationen finden Sie unter Empfangen von Registrierungsereignissen.

Das folgende VBScript-Codebeispiel zeigt, wie Sie eine Registrierungsänderung in der Struktur oder Unterstruktur HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft erkennen. Hierbei handelt sich um ein Überwachungsskript, das zu Demonstrationszwecken in einem Prozess namens „Wscript.exe“ ausgeführt wird, bis es im Task-Manager beendet wird, WMI angehalten wird oder das Betriebssystem neu gestartet wird. Das Skript verwendet einen halbsynchronenAufruf von SWbemServices.ExecNotificationQuery. Weitere Informationen zu halbsynchronen Aufrufen finden Sie unter Durchführen eines halbsynchronen Aufrufs mit 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

Das folgende VBScript-Codebeispiel zeigt, wie Sie Änderungen an den Werten eines Schlüssels überwachen können, indem Sie sich für den Ereignistyp RegistryKeyChangeEvent des Registrierungsanbieters registrieren. Das Skript ruft die asynchrone Methode SWbemServices.ExecNotificationQueryAsync auf. Weitere Informationen zu asynchronen Aufrufen und zur Sicherheit finden Sie unter Durchführen eines asynchronen Aufrufs mit VBScript.

Das folgende Skript wird unbegrenzt ausgeführt, bis der Computer neu gestartet, WMI beendet oder das Skript beendet wird. Um das Skript manuell zu beenden, beenden Sie den Prozess mithilfe des Task-Managers. Um das Skript programmgesteuert zu beenden, verwenden Sie die Methode Terminate in der Win32_Process-Klasse.

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