Ausführen eines Programms über die Befehlszeile basierend auf einem Ereignis
Die CommandLineEventConsumer-Klasse führt ein angegebenes ausführbares Programm über eine Befehlszeile aus, wenn ein angegebenes Ereignis auftritt. Diese Klasse ist ein Standardereignisconsumer, den WMI bereitstellt.
Wenn Sie CommandLineEventConsumer verwenden, sollten Sie die ausführbare Datei sichern, die Sie starten möchten. Wenn sich die ausführbare Datei nicht an einem sicheren Speicherort befindet oder nicht mit einer strengen Zugriffssteuerungsliste (ACL) geschützt ist, kann ein Benutzer ohne Zugriffsberechtigungen Ihre ausführbare Datei durch eine andere ausführbare Datei ersetzen. Sie können die Klassen Win32_LogicalFileSecuritySetting oder Win32_LogicalShareSecuritySetting verwenden, um die Sicherheit einer Datei oder Freigabe programmgesteuert zu ändern. Weitere Informationen finden Sie unter Erstellen eines Sicherheitsdeskriptors für ein neues Objekt in C++.
Das grundlegende Verfahren für die Verwendung von Standardconsumern ist immer identisch und wird unter Überwachen von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern beschrieben. Die folgende Prozedur ergänzt das grundlegende Verfahren, ist spezifisch für die Klasse CommandLineEventConsumer und beschreibt, wie ein Ereignisconsumer erstellt wird, der ein Programm ausführt.
Achtung
Die CommandLineEventConsumer-Klasse weist besondere Sicherheitseinschränkungen auf. Dieser Standardconsumer muss von einem lokalen Mitglied der Gruppe „Administratoren“ auf dem lokalen Computer konfiguriert werden. Wenn Sie ein Domänenkonto zum Erstellen des Abonnements verwenden, muss das LocalSystem-Konto über die erforderlichen Berechtigungen für die Domäne verfügen, um zu überprüfen, ob der Ersteller Mitglied der lokalen Gruppe „Administratoren“ ist.
CommandLineEventConsumer kann nicht verwendet werden, um einen Prozess zu starten, der interaktiv ausgeführt wird.
Im folgenden Verfahren wird beschrieben, wie Sie einen Ereignisconsumer erstellen, der einen Prozess über eine Befehlszeile ausführt.
So erstellen Sie einen Ereignisconsumer, der einen Prozess über eine Befehlszeile ausführt
- Erstellen Sie in der MOF-Datei (Managed Object Format) eine Instanz von CommandLineEventConsumer, um die Ereignisse zu empfangen, die Sie in der Abfrage anfordern. Weitere Informationen finden Sie unter Entwerfen von MOF-Klassen (Managed Object Format).
- Erstellen Sie eine Instanz von __EventFilter, und geben Sie ihr einen Namen.
- Erstellen Sie eine Abfrage, um den Typ des Ereignisses anzugeben. Weitere Informationen finden Sie unter Abfragen mit WQL.
- Erstellen Sie eine Instanz von __FilterToConsumerBinding, um den Filter der Instanz von CommandLineEventConsumer zuzuordnen.
- Kompilieren Sie Ihre MOF-Datei mit Mofcomp.exe.
Beispiel
Im folgenden Codebeispiel wird eine neue Klasse namens „MyCmdLineConsumer“ erstellt, um Ereignisse zu generieren, wenn am Ende einer MOF-Datei eine Instanz der neuen Klasse erstellt wird. Die Beispiele befinden sich im MOF-Code, aber Sie können die Instanzen programmgesteuert erstellen, indem Sie die Skript-API für WMI oder die COM-API für WMI verwenden.
Im folgenden Verfahren wird beschrieben, wie Sie eine neue Klasse namens MyCmdLineConsumer erstellen.
So erstellen Sie eine neue Klasse namens MyCmdLineConsumer
- Erstellen Sie die Datei „C:\cmdline_test.bat“ mit einem Befehl, der ein sichtbares Programm ausführt, z. B. mit „calc.exe“.
- Kopieren Sie die MOF-Liste in eine Textdatei, und speichern Sie sie mit der Erweiterung .mof.
- Kompilieren Sie die MOF-Datei in einem Befehlsfenster mit dem folgenden Befehl: Mofcomp dateiname.mof.
Hinweis
Das in cmdline_test.bat angegebene Programm sollte ausgeführt werden.
// 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";
};
Zugehörige Themen