Exécution d’un script basé sur un événement

Le consommateur standard implémenté par la classe ActiveScriptEventConsumer permet à un ordinateur d’exécuter un script et de prendre des mesures lorsque des événements importants se produisent pour s’assurer qu’un ordinateur peut détecter et résoudre les problèmes automatiquement.

Ce consommateur est chargé par défaut dans l’espace de noms root\subscription.

Vous pouvez configurer les performances de toutes les instances de ActiveScriptEventConsumer sur un système en définissant les valeurs des propriétés Timeout ou MaximumScripts dans une seule instance de ScriptingStandardConsumerSetting.

La procédure de base pour utiliser les consommateurs standard est toujours la même, et se trouve dans Surveillance et réponse aux événements avec des consommateurs standard. La procédure suivante, qui s’ajoute à la procédure de base, est spécifique à la classe ActiveScriptEventConsumer, et décrit comment créer un consommateur d’événements qui exécute un script.

Attention

La classe ActiveScriptEventConsumer a des contraintes de sécurité spéciales. Ce consommateur standard doit être configuré par un membre local du groupe Administrateurs sur l’ordinateur local. Si vous utilisez un compte de domaine pour créer l’abonnement, le compte LocalSystem doit avoir les permissions nécessaires sur le domaine pour vérifier que le créateur est membre du groupe Administrateurs local.

 

La procédure suivante décrit comment créer un consommateur d’événements qui exécute un script.

Pour créer un consommateur d’événements qui exécute un script

  1. Écrivez le script à exécuter lorsqu’un événement se produit.

    Vous pouvez écrire le script dans n’importe quel langage, mais assurez-vous qu’un moteur de script pour le langage choisi est installé sur votre machine. Le script n’a pas besoin d’utiliser des objets de script WMI.

    Seul un administrateur peut configurer un consommateur de script, et le script s’exécute sous les informations d’identification LocalSystem, ce qui donne de larges capacités au consommateur à l’exception de l’accès au réseau. Cependant, le script n’a pas accès aux données spécifiques de connexion utilisateur, par exemple, les variables d’environnement et les partages réseau.

  2. Dans le fichier Managed Object Format (MOF), créez une instance de ActiveScriptEventConsumer pour recevoir les événements que vous demandez dans la requête.

    Vous pouvez mettre le texte du script dans ScriptText, ou vous pouvez spécifier le chemin et le nom du fichier du script dans ScriptFileName. Pour plus d’informations, consultez Conception des classes format MOF (Managed Object Format).

  3. Créez une instance de __EventFilter, nommez-la, puis créez une requête pour spécifier le type d’événement qui déclenche l’exécution du script.

    Pour plus d’informations, consultez Requêtes avec WQL.

  4. Créez une instance de __FilterToConsumerBinding pour associer le filtre à l’instance de ActiveScriptEventConsumer.

  5. Compilez le fichier MOF en utilisant Mofcomp.exe.

Les exemples de la section suivante montrent deux façons de mettre en œuvre un script piloté par événement. Le premier exemple utilise un script défini dans un fichier externe, et le deuxième exemple utilise un script intégré dans le code MOF. Les exemples sont en code MOF, mais vous pouvez créer les instances de manière programmatique en utilisant soit l’API de script pour WMI soit l’API COM pour WMI.

Exemple utilisant un script externe

La procédure suivante décrit comment utiliser l’exemple de script externe.

Pour utiliser l’exemple de script externe

  1. Créez un fichier nommé c:\Asec.vbs, puis copiez-y le script de cet exemple.

  2. Copiez la liste MOF dans un fichier texte et enregistrez-le avec une extension .mof.

  3. Dans une fenêtre d’invite de commandes, compilez le fichier MOF en utilisant la commande suivante.

    Mofcomp nomdefichier**.mof**

  4. Exécutez la Calculatrice, ce qui crée un processus calc.exe. Attendez plus de cinq secondes, fermez la fenêtre de la Calculatrice, puis regardez dans le répertoire C:\ pour un fichier nommé ASEC.log.

    Le texte suivant est similaire au texte qui sera contenu dans le fichier ASEC.log.

    Time: 12/31/2002 2:56:33 PM; Entry made by: ASEC
    Application closed. UserModeTime:  1562500; 
    KernelModeTime: 3125000 [hundreds of nanoseconds]
    

L’exemple de code VBScript suivant montre le script qui est appelé lorsqu’un événement est reçu par le consommateur permanent. L’objet TargetEvent est une instance de __InstanceDeletionEvent donc il a une propriété nommée TargetInstance, qui est une instance de Win32_Process utilisée pour déclencher l’événement. La classe Win32_Process a les propriétés UserModeTime et KernelModeTime qui sont mises dans le fichier journal créé par le script.

' asec.vbs script
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\ASEC.log", 8, true)
objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC"

objFile.WriteLine "Application closed. UserModeTime:  " & _
    TargetEvent.TargetInstance.UserModeTime & _
    "; KernelModeTime: " & _
    TargetEvent.TargetInstance.KernelModeTime & _
    " [hundreds of nanoseconds]"
objFile.Close

L’exemple de code MOF suivant appelle le script lorsqu’un événement est reçu. Il crée le filtre, le consommateur et la liaison entre eux dans l’espace de noms root\subscription.

#pragma namespace ("\\\\.\\root\\subscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptFileName = "c:\\asec2.vbs";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

Exemple utilisant un script en ligne

La procédure suivante décrit comment utiliser l’exemple de script en ligne.

Pour utiliser l’exemple de script en ligne

  1. Copiez la liste MOF de cette section dans un fichier texte, et enregistrez-le avec une extension .mof.

  2. Dans une fenêtre d’invite de commandes, compilez le fichier MOF en utilisant la commande suivante.

    Mofcomp nomdefichier**.mof**

L’exemple de code MOF suivant crée le filtre, le consommateur et la liaison entre eux et contient également le script en ligne.

#pragma namespace ("\\\\.\\root\\subscription")

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    
    ScriptText =
        "Dim objFS, objFile\n"
        "Set objFS = CreateObject(\"Scripting.FileSystemObject\")\n"
        "Set objFile = objFS.OpenTextFile(\"C:\\ASEC.log\","
        " 8, true)\nobjFile.WriteLine \"Time: \" & Now & \";"
        " Entry made by: ASEC\"\nobjFile.WriteLine"
        " \"Application closed. UserModeTime:  \" & "
        "TargetEvent.TargetInstance.UserModeTime &_\n"
        "\"; KernelModeTime: \" & "
        "TargetEvent.TargetInstance.KernelModeTime "
        "& \" [hundreds of nanoseconds]\"\n"
        "objFile.Close\n";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

Surveillance et réponse aux événements avec des consommateurs standard