Exécution d’un programme à partir de la ligne de commande en fonction d’un événement
La classe CommandLineEventConsumer exécute un programme exécutable spécifié à partir d’une ligne de commande lorsqu’un événement spécifié se produit. Cette classe est un consommateur d’événements standard fourni par WMI.
Lorsque vous utilisez CommandLineEventConsumer, vous devez sécuriser l’exécutable que vous souhaitez démarrer. Si l’exécutable n’est pas dans un emplacement sécurisé ou qu’il n’est pas sécurisé à l’aide d’une liste de contrôle d’accès forte (ACL), un utilisateur sans privilèges d’accès peut le remplacer par un autre exécutable. Vous pouvez utiliser les classes Win32_LogicalFileSecuritySetting ou Win32_LogicalShareSecuritySetting pour modifier par programmation la sécurité d’un fichier ou d’un partage. Pour plus d’informations, consultez Création d’un descripteur de sécurité pour un nouvel objet en C++.
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 CommandLineEventConsumer et décrit comment créer un consommateur d’événements qui exécute un programme.
Attention
La classe CommandLineEventConsumer 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.
CommandLineEventConsumer ne peut pas être utilisé pour démarrer un processus qui s’exécute de manière interactive.
La procédure suivante décrit comment créer un consommateur d’événements qui exécute un processus à partir d’une ligne de commande.
Pour créer un consommateur d’événements qui exécute un processus à partir d’une ligne de commande
- Dans le fichier au format MOF (Managed Object Format), créez un instance de CommandLineEventConsumer pour recevoir les événements que vous demandez dans la requête. Pour plus d’informations, consultez Conception des classes format MOF (Managed Object Format).
- Créez un instance de __EventFilter et donnez-lui un nom.
- Créez une requête pour spécifier le type d’événement. Pour plus d’informations, consultez Interrogation de WQL.
- Créez une instance de __FilterToConsumerBinding pour associer le filtre à l’instance de CommandLineEventConsumer.
- Compilez votre fichier MOF à l’aide de Mofcomp.exe.
Exemple
L’exemple de code suivant crée une classe appelée « MyCmdLineConsumer » pour générer des événements lorsqu’une instance de la nouvelle classe est créée à la fin d’un MOF. L’exemple est 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.
La procédure suivante décrit comment créer une classe appelée MyCmdLineConsumer.
Pour créer une classe appelée MyCmdLineConsumer
- Créez le fichier c:\cmdline_test.bat avec une commande qui exécute un programme visible, tel que « calc.exe ».
- Copiez la liste MOF dans un fichier texte et enregistrez-la avec une extension .mof.
- Dans une Fenêtre Commande, compilez le fichier MOF à l’aide de la commande suivante : Mofcomp filename.mof.
Notes
Le programme spécifié dans cmdline_test.bat doit s’exécuter.
// Set the namespace as root\subscription.
// The CommandLineEventConsumer is already compiled
// in the root\subscription namespace.
#pragma namespace ("\\\\.\\Root\\subscription")
class MyCmdLineConsumer
{
[key]string Name;
};
// Create an instance of the command line consumer
// and give it the alias $CMDLINECONSUMER
instance of CommandLineEventConsumer as $CMDLINECONSUMER
{
Name = "CmdLineConsumer_Example";
CommandLineTemplate = "c:\\cmdline_test.bat";
RunInteractively = True;
WorkingDirectory = "c:\\";
};
// Create an instance of the event filter
// and give it the alias $CMDLINEFILTER
// The filter queries for instance creation event
// for instances of the MyCmdLineConsumer class
instance of __EventFilter as $CMDLINEFILTER
{
Name = "CmdLineFilter";
Query = "SELECT * FROM __InstanceCreationEvent"
" WHERE TargetInstance.__class = \"MyCmdLineConsumer\"";
QueryLanguage = "WQL";
};
// Create an instance of the binding
// between filter and consumer instances.
instance of __FilterToConsumerBinding
{
Consumer = $CMDLINECONSUMER;
Filter = $CMDLINEFILTER;
};
// Create an instance of this class right now.
// The commands in c:\\cmdline_test.bat execute
// as the result of creating the instance
// of MyCmdLineConsumer.
instance of MyCmdLineConsumer
{
Name = "CmdLineEventConsumer test";
};
Rubriques connexes