Delen via


Registreren voor systeemregister-gebeurtenissen

Als u meldingen wilt ontvangen van de System Registry provider, moet een beheertoepassing zich registreren als een tijdelijke gebeurtenisgebruiker. De meeste vereisten voor registratie voor de systeemregisterprovider zijn hetzelfde als andere gebeurtenisregistraties, behalve dat u ook de volgende procedure moet uitvoeren.

De registerprovider levert gebeurtenisklassen voor gebeurtenissen in het systeemregister. Zie Een WMI-gebeurtenis ontvangenvoor meer informatie over algemene gebeurtenisregistratie.

In de volgende procedure wordt beschreven hoe u zich registreert voor systeemregistergebeurtenissen.

Registreren voor systeemregister-gebeurtenissen

  1. Een meldingsquerymethode aanroepen.

    Gebruik in een script of C++een meldingsquery zoals SWbemServices.ExecNotificationQueryAsync of IWbemServices::ExecNotificationQueryAsync. Maak een queryreeks voor de parameter bstrQuery van IWbemServices::ExecNotificationQueryAsync of de strQuery in script.

  2. Bepaal welk type gebeurtenis u wilt ontvangen en maak de query.

    De volgende tabel bevat de register-gebeurtenisklassen die u kunt gebruiken.

    Gebeurtenisklasse Hive-locatie Beschrijving
    RegistryEvent N.V.T.
    Abstracte basisklasse voor wijzigingen in het register.
    RegistryTreeChangeEvent- RootPath
    Controleert wijzigingen in een hiërarchie van sleutels.
    RegisterSleutelVeranderingEvent KeyPath
    Controleert wijzigingen in één sleutel.
    RegistryValueChangeEvent WaardeNaam
    Houdt veranderingen in één waarde in de gaten.

    Deze klassen hebben een eigenschap met de naam Hive- die de hiërarchie van sleutels identificeert die moet worden bewaakt op wijziging, zoals HKEY_LOCAL_MACHINE.

    Wijzigingen in de HKEY_CLASSES_ROOT en HKEY_CURRENT_USER hives worden niet ondersteund door RegistryEvent- of klassen die ermee zijn afgeleid, zoals RegistryTreeChangeEvent.

  3. Maak de WHERE-clausule voor uw gebeurtenisregistratie.

    De systeemregisterprovider heeft specifieke regels voor WHERE-componenten. Zie Een juiste WHERE-component maken voor de registerprovidervoor meer informatie. Zie Query's uitvoeren met WQLvoor meer algemene informatie over het maken van een WHERE-clausule.

  4. Bepaal of uw consument gebeurtenissen ontvangt.

    De systeemregisterprovider garandeert niet dat alle verzonden gebeurtenissen worden geleverd. Zie Register-gebeurtenissen ontvangenvoor meer informatie.

In het volgende VBScript-codevoorbeeld ziet u hoe u een registerwijziging in de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft hive of substructuur kunt detecteren. Dit is een bewakingsscript dat voor demonstratiedoeleinden wordt uitgevoerd in een proces met de naam Wscript.exe totdat het is beëindigd in Taakbeheer, WMI is gestopt of het besturingssysteem opnieuw wordt opgestart. Het script maakt gebruik van een semisynchrone aanroep naar SWbemServices.ExecNotificationQuery. Zie Een semisynchrone aanroep maken met VBScriptvoor meer informatie over semisynchrone aanroepen.

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

In het volgende VBScript-codevoorbeeld ziet u hoe u de wijziging in de waarden van een sleutel kunt bewaken door u te registreren voor het gebeurtenistype van de registerprovider RegistryKeyChangeEvent. Het script roept een asynchrone methode aan, SWbemServices.ExecNotificationQueryAsync. Zie Een asynchrone aanroep maken met VBScriptvoor meer informatie over asynchrone aanroepen en beveiliging.

Het volgende script wordt voor onbepaalde tijd uitgevoerd totdat de computer opnieuw is opgestart, WMI is gestopt of het script is gestopt. Als u het script handmatig wilt stoppen, gebruikt u Taakbeheer om het proces te stoppen. Als u deze programmatisch wilt stoppen, gebruikt u de methode Terminate in de klasse Win32_Process.

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