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 il file eseguibile non si trova in una posizione sicura o non è protetto con un elenco di controllo di accesso (ACL) sicuro, un utente senza privilegi di accesso può sostituire l'eseguibile con un file eseguibile diverso. È possibile utilizzare le classi Win32 _ LogicalFileSecuritySetting o Win32 _ LogicalShareSecuritySetting per modificare a livello di codice la sicurezza di un file o di una condivisione. Per ulteriori informazioni, vedere creazione di un descrittore di sicurezza per un nuovo oggetto in C++.

La procedura di base per l'uso di consumer standard è sempre la stessa e si trova nel monitoraggio e nella 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 presenta vincoli di sicurezza speciali. Questo consumer standard deve essere configurato da un membro locale del gruppo Administrators nel computer locale. Se si utilizza un account di dominio per creare la sottoscrizione, è necessario che l'account LocalSystem disponga delle autorizzazioni necessarie per il dominio per verificare che il creatore sia un membro del gruppo Administrators locale.

Non è possibile usare CommandLineEventConsumer per avviare un processo che viene eseguito in modo interattivo.

Nella procedura seguente viene descritto 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 ulteriori informazioni, vedere progettazione di classi Managed Object Format (MOF).
  2. Creare un'istanza di _ _ EventFilter e assegnarle un nome.
  3. Creare una query per specificare il tipo di evento. Per ulteriori 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 file MOF. L'esempio è nel codice MOF, ma è possibile creare le istanze a livello di programmazione usando l' API di scripting per WMI o l' API com per WMI.

Nella procedura seguente viene descritto come creare una nuova classe denominata MyCmdLineConsumer.

Per creare una nuova classe denominata MyCmdLineConsumer

  1. Creare il \ _ file ditest.bat c: cmdline con un comando che esegue un programma visibile, ad esempio "calc.exe".
  2. Copiare il file MOF in un file di testo e salvarlo con un'estensione MOF.
  3. In una finestra di comando compilare il file MOF usando il comando seguente: mofcomp nomefile. 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