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 d’agir lorsque des événements importants se produisent pour s’assurer qu’un ordinateur peut détecter et résoudre automatiquement les problèmes.

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

Vous pouvez configurer la performance de toutes les instances d’ActiveScriptEventConsumer pour un système en définissant les valeurs de la propriété Timeout ou MaximumScripts dans l’instance unique de ScriptingStandardConsumerSetting.

La procédure de base pour l’utilisation des 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, s’ajoutant à 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 disposer des autorisations 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 a lieu.

    Vous pouvez écrire le script dans n’importe quelle langue, mais assurez-vous qu’un moteur de script pour la langue que vous choisissez est installé sur votre ordinateur. 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 dans les informations d’identification LocalSystem, ce qui offre des fonctionnalités étendues au consommateur, à l’exception de l’accès réseau. Toutefois, le script n’a pas accès aux données d’ouverture de session utilisateur spécifiques (p. ex., variables d’environnement et partages réseau).

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

    Vous pouvez placer le texte du script dans ScriptText ou spécifier le chemin d’accès et le nom 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 Interrogation de WQL.

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

  5. Compilez le fichier au format MOF à l’aide de Mofcomp.exe.

Les exemples de la section suivante montrent deux façons d’implémenter un script piloté par les événements. Le premier exemple utilise un script défini dans un fichier externe, et le second utilise un script intégré au code MOF. Les exemples sont en code MOF, mais vous pouvez créer les instances par programmation à l’aide de l’API de scripts pour WMI ou de l’API COM pour WMI.

Exemple d’utilisation d’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 le script dans cet exemple.

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

  3. Dans une fenêtre d’invite de commandes, compilez le fichier au format MOF à l’aide de la commande suivante.

    Mofcompfilename**.mof**

  4. Exécutez la calculatrice, qui crée un processus calc.exe. Attendez plus de cinq secondes, fermez la fenêtre de la calculatrice, puis recherchez dans le répertoire C:\ 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 appelé lorsqu’un événement est reçu par le consommateur permanent. L’objet TargetEvent étant une instance __InstanceDeletionEvent, il possède une propriété nommée TargetInstance, qui est une instance Win32_Process utilisée pour déclencher l’événement. La classe Win32_Process possède les propriétés UserModeTime et KernelModeTime qui sont placées 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 d’utilisation d’un script Inline

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

Pour utiliser l’exemple de script Inline

  1. Copiez la liste MOF de cette section dans un fichier texte et enregistrez-la avec l’extension .mof.

  2. Dans une fenêtre d’invite de commandes, compilez le fichier au format MOF à l’aide de la commande suivante.

    Mofcompfilename**.mof**

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

#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 les consommateurs standard