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 l'eseguibile da avviare. Se l'eseguibile non si trova in un percorso sicuro o non è protetto 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 la sicurezza di un file o di una condivisione a livello di codice. Per altre informazioni, vedere Creazione di un descrittore di sicurezza per un nuovo oggetto in C++.

La procedura di base per l'utilizzo dei consumer standard è sempre la stessa e si trova in Monitoraggio e risposta agli eventi con consumer standard. La procedura seguente aggiunge alla routine 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 MOF (Managed Object Format) 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 Esecuzione di 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 si trova nel codice MOF, ma è possibile creare le istanze a livello di codice usando l'API di scripting per WMI o l'API COM 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 estensione mof.
  3. In una finestra di 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