Windows PowerShell: Reagieren auf WMI-Ereignisse
Das Nachverfolgen, Überwachen und Reagieren auf Systemereignisse gelingt mit Windows gut, aber probieren Sie es einmal mit Windows PowerShell.
Don Jones
Eines der Dinge praktische Informationen über das Windows-Betriebssystem ist die Unterstützung für Ereignisse.
Wenn Sie etwas in das Betriebssystem auftritt, wird ein Ereignis generiert.
Bit-Code, z. B. Anwendungen, können registrieren, um bestimmte Ereignisse benachrichtigt werden, so dass Sie mit einer Aktion reagieren können.
Z. B. Wenn Sie auf eine Schaltfläche in einem Dialogfeld klicken, die Anwendung empfängt die Benachrichtigung von “ Klickereignis ” und weiß um zu tun, was es um zu tun, wenn ein Benutzer auf diese Schaltfläche klickt vorgesehen hat.
Windows-Verwaltungsinstrumentation (WMI) können Ereignisse auch erstellen, und Sie können Windows PowerShell v2 empfangen Ereignisse registrieren.
Die Shell können Sie beliebige Befehle, die Sie als Reaktion auf diese Ereignisse ausgeführt.
WMI wird i. d. r. eine eine relativ kleine Anzahl von Ereignissen ausgelöst, aber Sie können dies tun, für einen großen Bereich von anderen WMI-Klassen.
Es gibt drei wichtige Punkte mithilfe der WMI-Ereignisse:
-
Sie möchten wissen, welches Ereignis
-
kennen die Klasse das Ereignis soll
-
verwenden das Cmdlet Register WMIEvent Ereignisbenachrichtigungen zu registrieren
Einfache Ereignisse
Einige WMI-Klassen werden Ereignisse generieren.
Die Klasse Win32_ProcessStartTrace generiert z. B. Ereignisse, wenn ein Prozess gestartet wird.
Es wird auch in anderen Situationen geschehen.
Wenn das Ereignis für einen neuen Prozess ausgelöst wird, hat es eine Quell-ID “ Process Started ”. Um Ereignisse zu registrieren, würden Sie diesen Befehl ausführen:
Register-WmiEvent –class "Win32_ProcessStartTrace"
–sourceIdentifier "Process Started"
Natürlich lediglich wissen, dass ein Prozess gestartet nicht hilfreich ist.
Wahrscheinlich werden Sie definieren eine Aktion zum Protokollieren des Prozess, eine e-Mail-Nachricht senden oder auch den Prozess zu beenden.
Führen Sie die Get-EventSubscriber das Ereignisabonnement-Benachrichtigung sehen, das Sie gerade erstellt haben.
Führen Sie zum Entfernen aller Ereignisregistrierungen Get EventSubscriber | ' Registrierung aufheben '-Ereignis.
Registrierung-Ereignis können auch um ein bestimmtes Abonnement durch die ID-Nummer zu entfernen.
Verbesserte Ereignisse
Einige der WMI erzeugen kann Ereignisse auf Systemebene sind sogar noch nützlicher.
Ein Ereignis mit der Bezeichnung __instancecreationevent wird z. B. ausgelöst, sobald eine neue Instanz einer WMI-Klasse erstellt wird;__InstanceDeletionEvent wird ausgelöst, wenn eine Instanz gelöscht wird.
Dies mag nicht nützlich, aber denke über es fast jedes Element der Hardware Betriebssystem- und Computer durch bestimmte Instanz einer WMI-Klasse dargestellt wird.
Beispielsweise erhalten Win32_LogicalDisk eine neue Instanz, wenn Sie einen austauschbaren Datenträger anhängen.
Win32_Process verlieren eine Instanz, wenn ein Prozess beendet wird.
Um eine Meldung anzuzeigen, wenn Benutzer ein neues USB-Laufwerk einfügen möchten?
Register-wmievent –query "select * from __instancecreationevent within 5 where targetinstance isa 'win32_logicaldisk'" –action { Write "You had better not put any proprietary information on that!" }
Diese Abfrage kann aufzuschlüsseln, ziemlich schwierig sein, so sieht, wie es funktioniert:
-
SELECT * FROM __instancecreationevent (die zwei unterstrichen im Ereignis Name die Art und Weise ist) einfach gibt an, dass alle Eigenschaften, die von diesem Ereignis abgerufen werden soll.
-
WITHIN 5 gibt an, dass wir nur Ereignisse alle fünf Sekunden überprüfen möchten.
Keine dieser Wert zu niedrig festgelegt oder mit sehr viel Rechenleistung für regelmäßig nach Updates gesucht aufgewendete landen werde.
-
WHERE TARGET INSTANCE ISA "Win32_LogicalDisk"teilt WMI, dass wir nur Ereignisse sollen, die eine neue Instanz der Win32_LogicalDisk-Klasse erstellt.
Schließlich ist der Parameter –action einen Skriptblock – {geschweiften Klammern} eingeschlossen – enthält die Aktion, die auftreten, wenn das Ereignis ausgelöst werden soll.
Mit dem –computerName-Parameter zum Registrieren für Ereignisse, die auf einem Remotecomputer auftreten, ist eine praktische Stich.
Müssen Sie ein lokaler Administrator auf dem Remotecomputer sein, und die Aktion auf dem Computer nicht auf das remote geschieht.
Übrigens nicht sein, z. B. Erstellungsereignisse für die CIM_DataFile-Klasse zu registrieren, die Dateien auf der Festplatte dazu verleitet.
WMI ist nicht sehr effizient zur Dateierstellung einer neuen zu überwachen.
Es wird wahrscheinlich verpassen Sie Ereignisse und kann sehr hohen Verwaltungsaufwand in versuchen, alles catch aufzuerlegen.
Vorsichtsmaßnahmen und Tricks
Antworten auf Ihre Ereignisse werden natürlich nur für fortgesetzt werden, solange die Shell ausgeführt wird.
Wenn Sie die Shell schließen oder eigenständig aus irgendeinem Grund schließt, wird die Ereignisregistrierung nicht mehr angezeigt.
Stellt WMI-Ereignisse für die Ausführung auf Computern Benutzer weniger nützlich, weil Sie wahrscheinlich auf die Shell nach oben und auf alle Benutzer des Computers ausgeführt überhaupt sind ständig.
Dies kann ein sehr nützliches Trick, jedoch werden für die Überwachung von Prozessen oder anderen Elementen auf dem Server, auf dem Sie mehr Kontrolle haben
Innerhalb des Skriptblocks –action haben Sie Zugriff auf eine automatische Variablen namens $-Argumente, die Argumente enthält, die vom Ereignis übergeben werden.
Verwenden Sie schreiben $ Args in Ihrem –action Skriptblock, welche Argumente für einen bestimmten WMI-vorhanden sind.
Lesen Sie etwas mehr über WMI-Ereignisse und beziehen Sie Shell-Befehle auf der Seite TechNet WMI Event Monitoring .
Don Jones
ist ein Gründer von Concentrated Technology und Antworten Fragen zu Windows PowerShell und andere Technologien am ConcentratedTech.com.
Außerdem ist er Autor für Nexus.Realtimepublishers.com, wodurch viele seinen Büchern als kostenloser elektronischer Editionen über seine Website verfügbar sind.
Verwandter Inhalt