Esecuzione di un programma dalla riga di comando in base a un evento

La classe CommandLineEventConsumer esegue un programma eseguibile specificato da una riga di comando quando si verifica un evento specificato. Questa classe è un consumer di eventi standard fornito da WMI.

Quando si usa CommandLineEventConsumer, è necessario proteggere il file eseguibile che si vuole avviare. Se l'eseguibile non si trova in una posizione sicura o non è protetta con un elenco di controllo di accesso sicuro (ACL), un utente senza privilegi di accesso può sostituire il file eseguibile con un file eseguibile diverso. È possibile usare le classi Win32_LogicalFileSecuritySetting o Win32_LogicalShareSecuritySetting per modificare a livello di codice la sicurezza di un file o di una condivisione. Per altre informazioni, vedere Creazione di un descrittore di sicurezza per un nuovo oggetto in C++.

La procedura di base per l'uso dei consumer standard è sempre la stessa e si trova in Monitoraggio e risposta agli eventi con consumer standard. La procedura seguente aggiunge alla procedura di base, è specifica della classe CommandLineEventConsumer e descrive come creare un consumer di eventi che esegue un programma.

Attenzione

La classe CommandLineEventConsumer ha vincoli di sicurezza speciali. Questo consumer standard deve essere configurato da un membro locale del gruppo Administrators nel computer locale. Se si usa un account di dominio per creare la sottoscrizione, l'account LocalSystem deve disporre delle autorizzazioni necessarie per il dominio per verificare che l'autore sia membro del gruppo Administrators locale.

CommandLineEventConsumer non può essere usato per avviare un processo che viene eseguito in modo interattivo.

 

La procedura seguente descrive come creare un consumer di eventi che esegue un processo da una riga di comando.

Per creare un consumer di eventi che esegue un processo da una riga di comando

  1. Nel file Managed Object Format (MOF) creare un'istanza di CommandLineEventConsumer per ricevere gli eventi richiesti nella query. Per altre informazioni, vedere Progettazione di classi MOF (Managed Object Format).
  2. Creare un'istanza di __EventFilter e assegnargli un nome.
  3. Creare una query per specificare il tipo di evento. Per altre informazioni, vedere Query con WQL.
  4. Creare un'istanza di __FilterToConsumerBinding per associare il filtro all'istanza di CommandLineEventConsumer.
  5. Compilare il file MOF usando Mofcomp.exe.

Esempio

Nell'esempio di codice seguente viene creata una nuova classe denominata "MyCmdLineConsumer" per generare eventi quando viene creata un'istanza della nuova classe alla fine di un MOF. L'esempio è nel codice MOF, ma è possibile creare le istanze a livello di codice usando l'API scripting per WMI o l'APICOM per WMI.

La procedura seguente descrive come creare una nuova classe denominata MyCmdLineConsumer.

Per creare una nuova classe denominata MyCmdLineConsumer

  1. Creare il file c:\cmdline_test.bat con un comando che esegue un programma visibile, ad esempio "calc.exe".
  2. Copiare moF in un file di testo e salvarlo con un'estensione mof.
  3. In una finestra comando compilare il file MOF usando il comando seguente: Mofcomp filename.mof.

Nota

Il programma specificato in cmdline_test.bat deve essere eseguito.

 

// 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";
};

Monitoraggio e risposta agli eventi con consumer standard