Inscription aux événements du registre de système

Pour recevoir des notifications du fournisseur System Registry, une application de gestion doit être inscrite en tant que consommateur d’événements temporaire. La plupart des conditions requises pour s’inscrire au fournisseur System Registry sont identiques à celles de toute autre inscription, sauf que vous devez également effectuer la procédure suivante.

Le fournisseur de registre fournit des classes d’événements pour les événements dans le registre de système. Pour plus d’informations sur l’inscription générale des événements, consultez Réception d’un événement WMI.

La procédure suivante décrit comment s’inscrire aux événements du registre de système.

Inscription aux événements du registre de système

  1. Appelez une méthode de requête de notification.

    Dans le script ou C++, utilisez une requête de notification telle que SWbemServices.ExecNotificationQueryAsync ou IWbemServices::ExecNotificationQueryAsync. Créez une chaîne de requête pour le paramètre bstrQuery de IWbemServices::ExecNotificationQueryAsync ou strQuery dans le script.

  2. Déterminez le type d’événement que vous souhaitez recevoir et créez la requête.

    Le tableau suivant répertorie les différentes valeurs de registre que vous pouvez entrer.

    Classe d'événements Emplacement Hive Description
    RegistryEvent N/A
    Classe de base abstraite pour les modifications apportées au registre.
    RegistryTreeChangeEvent RootPath
    Surveille les modifications apportées à une hiérarchie de clés.
    RegistryKeyChangeEvent KeyPath
    Surveille les modifications apportées à une seule clé.
    RegistryValueChangeEvent ValueName
    Surveille les modifications apportées à une valeur unique.

    Ces classes ont une propriété appelée Hive qui identifie la hiérarchie des clés à surveiller pour les modifications, telles que HKEY_LOCAL_MACHINE.

    Les modifications apportées aux ruches HKEY_CLASSES_ROOT et HKEY_CURRENT_USER ne sont pas prises en charge par RegistryEvent ou les classes dérivées de celui-ci, telles que RegistryTreeChangeEvent.

  3. Créez la clause WHERE pour votre inscription d’événement.

    Le fournisseur de registre de système suit des règles spécifiques concernant les clauses WHERE. Pour plus d’informations, consultez Création d’une clause WHERE appropriée au fournisseur de registre. Pour consulter les informations générales sur la création d’une clause WHERE, consultez Interrogation avec WQL.

  4. Déterminez si votre consommateur reçoit des événements.

    Le fournisseur de registre système ne garantit pas que tous les événements envoyés seront remis. Pour plus d’informations, consultez Réception d’événements de manière sécurisée.

L’exemple de code VBScript suivant montre comment détecter une modification du registre dans la ruche ou la sous-arborescence HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft. Il s’agit d’un script de supervision qui, à des fins de démonstration, s’exécute dans un processus nommé Wscript.exe jusqu’à ce qu’il soit arrêté dans le Gestionnaire de tâches, que WMI soit arrêté ou que le système d’exploitation soit redémarré. Le script utilise un appel semi-synchrone à SWbemServices.ExecNotificationQuery. Pour plus d’informations sur les appels semi-synchrones, consultez Effectuer un appel semi-synchrone avec 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

L’exemple de code VBScript suivant montre comment surveiller la modification des valeurs d’une clé en s’inscrivant pour le type d’événement du fournisseur de registre RegistryKeyChangeEvent. Le script appelle une méthode asynchrone, SWbemServices.ExecNotificationQueryAsync. Pour plus d’informations sur les appels asynchrones et la sécurité, consultez Effectuer un appel asynchrone avec VBScript.

Le script suivant s’exécute indéfiniment jusqu’à ce que l’ordinateur soit redémarré, que WMI soit arrêté ou que le script soit arrêté. Pour arrêter le script manuellement, utilisez le Gestionnaire des tâches pour arrêter le processus. Pour l’arrêter par programmation, utilisez la méthode Terminate dans la classe 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