Wussten Sie, dass Sie in Windows praktisch jede Aktion überwachen können? Nein, Sie müssen keine teure Software kaufen. Die Infrastruktur überwacht Ereignisse wie das Starten und Beenden von Diensten, das Erstellen von Dateien oder Ordnern und vieles mehr über Windows Management Instrumentation (WMI)-Ereignisse.
WMI-Ereignisse sind keine spezifische Funktion von PowerShell, aber eine der einfachsten Möglichkeiten, WMI-Ereignisse zu nutzen und praktische Tools zu erstellen, ist PowerShell. In diesem schrittweisen Tutorial lernen Sie, wie Sie WMI-Ereignisse mit PowerShell nutzen und die Fähigkeiten entwickeln, einige nützliche Überwachungstools zu erstellen!
Legen wir los!
Voraussetzungen
In diesem praktischen Tutorial werden viele Demos gezeigt. Wenn Sie einer der Demos folgen möchten, stellen Sie sicher, dass Sie Folgendes haben:
- Windows 7+ oder Windows Server 2012+ – Dieses Tutorial verwendet Windows Server 2019.
- Angemeldet als Benutzer in der lokalen Administratorengruppe.
- Windows PowerShell 5.1 oder PowerShell 6+ – Dieses Tutorial verwendet PowerShell v7.1.2.
Verständnis von WMI und CIM
Bevor Sie sich mit WMI-Ereignissen beschäftigen können, ist es wichtig, die Infrastruktur zu verstehen, auf der sie aufbauen. Obwohl dieses Tutorial nicht detailliert auf WMI eingeht, können Sie jederzeit die WMI-Dokumentation von Microsoft zur weiteren Information konsultieren.
WMI und das damit verbundene Datenmodell Common Information Model (CIM) sind in Windows integrierte Modelle, die nahezu jede Information im Zusammenhang mit der Funktionsweise von Windows und den darauf ausgeführten Prozessen in einem Repository speichern.
WMI und CIM sind leistungsstarke Tools, die von Administratoren verwendet werden, um Windows sowohl lokal als auch remote zu verwalten. Mit WMI oder CIM können Administratoren Informationen über ein Windows-System abfragen, wie z.B. installierte Anwendungen, Status von Diensten, Dateien im Dateisystem und vieles mehr.
WMI und CIM sind die Grundlage vieler Enterprise-Monitoring-Lösungen zur Erfassung von Betriebssystem- und Anwendungsgesundheitsdaten. Aber Sie müssen keine teure Überwachungssoftware kaufen, um WMI nutzen zu können; Sie haben PowerShell!
Fangen wir mit den beiden grundlegenden Elementen an, und im Verlauf werden Sie die anderen benötigten Elemente kennenlernen:
- Klassen: Die Klassen sind die Ereignisse und Eigenschaften, auf die eine Anwendung wie PowerShell zugreifen kann, um Daten zu lesen und zu aktualisieren. Die Klassen befinden sich in einem Namespace.
- Namespace: Der Namespace ist ein Container für mit WMI zusammenhängende Klassen. Stellen Sie sich ihn wie einen Ordner „Meine Bilder“ vor, der bildbezogene Inhalte enthält. Es gibt mehrere Namespaces, wobei der häufigste CIMv2 ist, der die meisten Betriebssystemklassen enthält. Alle Namespaces befinden sich jedoch unter dem großen einzelnen Namespace Root.

WMI vs. CIM
WMI und CIM sind beide Methoden zur Interaktion mit dem Repository auf einem Windows-System, das eine Vielzahl von Informationen enthält, und zur Arbeit mit WMI-Ereignissen (mehr dazu später). Beide Methoden haben jedoch einige Unterschiede, hauptsächlich in der Art und Weise, wie Administratoren remote mit ihnen interagieren.
WMI wurde mit Windows NT4 eingeführt und war der ursprüngliche (und einzige) Weg zur Interaktion mit dem Repository. Wenn Sie ein Windows-System mit WMI verwalten, verwendet Windows Distributed Component Object Model (DCOM). DCOM ist ein Remote-Protokoll, das von WMI verwendet wird, um Informationen im Daten-Repository auf einem Windows-Rechner freizugeben.
Um über ein Netzwerk zu arbeiten, verwendet DCOM Remote Procedure Call (RPC). Zur Kommunikation über ein Netzwerk verwendet RPC dynamische Portbereiche, was manchmal eine Herausforderung für Firewalls und Network Address Translation (NAT)-Geräte darstellt.
Wenn Sie Probleme mit RPC haben, werfen Sie einen Blick auf den Artikel Testen Sie RPC-Verbindungen mit den dynamischen Ports.
Microsoft hat sich entschieden, CIM zu nutzen, um einen moderneren Ansatz zur Interaktion mit dem Datenrepository in Windows bereitzustellen. Anstelle von RPC verwendet CIM WS-MAN (Web-Service für Management), ein HTTP-Protokoll, das für die Remote-Verwaltung besser geeignet ist.
In diesem Artikel und anderen kann WMI und CIM synonym verwendet werden. Das Datenrepository, mit dem beide Verwaltungsmethoden interagieren, wird in der Regel als WMI-Repository bezeichnet. Fast alle Begriffe beziehen sich auf WMI, während CIM in der Regel in PowerShell-Cmdlets verwendet wird.
WMI vs. CIM und PowerShell
Glücklicherweise haben Sie bei der Verwendung von WMI und CIM mit PowerShell einige Optionen. PowerShell unterstützt beide Möglichkeiten der Interaktion mit dem Datenrepository. Wenn Sie den Befehl Get-Command
in PowerShell ausführen, werden Ihnen möglicherweise verschiedene Wmi
-Cmdlets wie Get-WmiObject
, Invoke-WmiMethod
, Remove-WmiObject
, Register-WmiEvent
und Set-WmiInstance
angezeigt.
Wenn Sie Windows PowerShell 3 oder höher (was Sie hoffentlich haben!) ausführen, werden Ihnen auch einige ähnlich benannte Cmdlets wie Get-CimInstance
, Get-CimClass
und Remove-CimInstance
angezeigt.
Welche PowerShell-Cmdlets sollten Sie verwenden? Die Antwort ist einfach: die CIM-Cmdlets. CIM ist der neue Standard, auf den Microsoft sich konzentriert. Die WMI-Cmdlets sind nicht einmal in PowerShell Core verfügbar!
Abfragen von WMI: Die Grundlagen
Bevor Sie sich mit WMI-Ereignissen befassen können, müssen Sie verstehen, wie Sie WMI mit PowerShell abfragen können. Die Abfrage von Informationen aus dem WMI-Repository ist die häufigste Verwendung von WMI-Daten.
Um WMI-Daten in der PowerShell-Welt abzufragen, ist der Get-CimInstance
-Befehl Ihr Freund. Dieser Befehl bietet verschiedene Möglichkeiten, um WMI-Daten abzufragen. In diesem Tutorial liegt der Fokus jedoch auf dem Query
-Parameter. Der Query
-Parameter ermöglicht es Ihnen, eine Windows Query Language (WQL)-Abfrage zur Abfrage von WMI bereitzustellen.
Zum Beispiel möchten Sie vielleicht alle WMI-Instanzen in der Klasse Win32_Service
finden. Ähnlich wie bei SQL verwenden Sie die Abfrage Select * from Win32_Service
, wie unten gezeigt. Das Sternchen (*
) teilt WMI mit, dass alle Eigenschaften jeder gefundenen Instanz zurückgegeben werden sollen.

In dem oben genannten Beispiel haben Sie alle Instanzen jedes Dienstes in der Klasse Win32_Service
gefunden, aber was ist, wenn Sie nur einige finden möchten? In diesem Fall verwenden Sie die WHERE
-Klausel. Die WHERE
-Klausel erstellt einen Filter, um nur Instanzen zurückzugeben, die einer bestimmten Bedingung entsprechen.
Die WHERE
-Klausel gibt Get-CimInstance
an, nur Instanzen zurückzugeben, bei denen die Instanzeigenschaft einen bestimmten Wert hat. Möglicherweise möchten Sie beispielsweise nur die Dienstinstanzen finden, bei denen die Eigenschaft State
den Wert Running
hat. In diesem Fall würden Sie die WHERE
-Klausel Where State='Running'
definieren, wie unten gezeigt.
Wie Sie unten sehen können, hat Get-CimInstance
nur die Dienstinstanzen zurückgegeben, bei denen die Eigenschaft State
gleich Running
war.

WMI-Ereignisse: Die Aktionen von WMI
WMI enthält ein großes Repository mit Informationen über Tausende von Elementen in Windows. Sie können auf diese Informationen zugreifen, indem Sie sie abfragen, wie Sie es oben getan haben, aber es hat auch eine weitere weniger bekannte Funktion: WMI-Ereignisse.
In Windows können zu jedem Zeitpunkt Hunderte von Ereignissen auftreten. Wenn Sie verschiedene Funktionen von Windows verwenden, wie das Erstellen von Dateien, das Starten und Stoppen von Diensten, das Installieren von Software oder andere Aktionen, wird wahrscheinlich ein WMI-Ereignis ausgelöst.
Praktisch jede Aktion, die auf Windows durchgeführt wird, kann über ein WMI-Ereignis abgebildet werden. Wenn eine Aktion auf Windows ausgeführt wird, löst Windows über seine interne Infrastruktur ein Ereignis aus. Standardmäßig können Sie diese Ereignisse nicht sehen, da sie im Hintergrund stattfinden. Um diese Ereignisse zu sehen, müssen Sie sich dafür registrieren.
Erstellen eines Dienstüberwachungsskripts mit PowerShell
Um zu demonstrieren, wie WMI-Ereignisse funktionieren, anstatt Sie mit Unmengen an Informationen zu langweilen, lassen Sie uns stattdessen ein nützliches Werkzeug erstellen. Da WMI-Ereignisse auftreten, wenn ein Ereignis in Windows auftritt, können Sie damit einige praktische Überwachungstools erstellen.
Vielleicht möchten Sie eine Nachricht in eine Protokolldatei schreiben, wenn sich der Status eines Windows-Dienstes auf einem kritischen Server ändert. Anschließend können Sie sich für die WMI-Ereignisse anmelden, die durch diese Aktionen ausgelöst werden. Wenn Sie sich für das Ereignis anmelden und das Ereignis ausgelöst wird, können Sie eine Aktion ausführen, wie z.B. das Protokollieren in eine Datei, das Versenden einer E-Mail oder so ziemlich alles andere, was Sie mit PowerShell tun können.
Anstatt eine teure Überwachungslösung zu kaufen, kann ein einfaches PowerShell-Skript ein großartiges Monitoring-Tool für den armen Mann sein! Wenn Sie bereit sind, öffnen Sie Ihre PowerShell-Konsole und legen Sie los!
Auffinden der CIM-Klasse
In WMI sind Ereignisse wie statische Instanzen in Klassen enthalten. Diese Klassen enthalten alle statischen Daten, die Sie oben abgefragt haben, und dort werden Änderungen an diesen Instanzen ausgelöst. Eine Liste aller CIM-Klassen finden Sie in der Microsoft-Dokumentation.
Um alle CIM-Klassen zu finden, führen Sie das Get-CimClass
-Cmdlet ohne Parameter aus. Das Get-CimClass
-Cmdlet gibt standardmäßig alle Klassen im Namespace ROOT/cimv2
zurück. Der Namespace ROOT/cimv2
ist der „Haupt“-Namespace, in dem nahezu alle interessanten Windows-Klassen gespeichert sind.
Wie Sie jedoch unten sehen können, werden viele Klassen zurückgegeben.

Vielleicht haben Sie ein wenig recherchiert und endlich festgestellt, dass Windows-Dienste alle in der Win32_Service
gespeichert sind. Wenn Sie also den Klassennamen kennen, verwenden Sie den Parameter ClassName
, um den Namen anzugeben, wie unten gezeigt.

Auffinden der Eigenschaften der CIM-Klasse
Sobald Sie wissen, welche Klasse Sie suchen müssen, müssen Sie herausfinden, welche Eigenschaft Sie überprüfen möchten. Wenn sich der Wert einer Instanzeigenschaft ändert (oder eine ganze Instanz erstellt oder entfernt wird), wird ein Ereignis ausgelöst. Sie müssen diese Zustandsänderung erfassen. Dazu müssen Sie wissen, welche Eigenschaft Sie überwachen möchten.
Um diese Eigenschaft zu finden, inspizieren Sie das PowerShell-Objekt CimClassProperties
auf der CIM-Klasseninstanz, die Sie im vorherigen Abschnitt abgefragt haben.
Beachten Sie, dass eine dieser Eigenschaften die Eigenschaft State
ist.

Jetzt, da Sie wissen, welche CIM-Klasse und Eigenschaft Sie überwachen möchten, ist es an der Zeit, sich für das WMI-Ereignis zu registrieren!
Erstellen einer WMI-Ereignisabonnement: Der Überblick auf hoher Ebene
Das Erstellen eines WMI-Ereignisabonnements kann eine verwirrende Aufgabe sein, wenn Sie zuvor noch keines erstellt haben. Um Ihnen zu helfen, den Überblick zu behalten, wollen wir zuerst den Wald vor den Bäumen betrachten und die grundlegenden Schritte umreißen.
Das Erstellen eines WMI-Ereignisabonnements erfordert grob vier Schritte:
- Erstellen der WQL-Abfrage – Genauso wie bei der Abfrage von statischen Daten müssen Sie eine WQL-Abfrage erstellen, die dem Typ des WMI-Ereignisses entspricht, das Sie sehen möchten. Aber im Gegensatz zur Abfrage des Datenspeichers müssen Sie in der Abfrage einige kompliziertere Komponenten wie Systemklassen und Überprüfungsschleifen einsetzen (mehr dazu später).
- Erstellen des Ereignisfilters – Sobald Sie die WQL-Abfrage erstellt haben, müssen Sie den Ereignisfilter erstellen. Der Ereignisfilter registriert die WQL-Abfrage in CIM.
- Erstellen des Verbrauchers – Der Verbraucher definiert die Aktion, die ausgeführt wird, wenn die Abfrage des Ereignisfilters eine Änderung in der Klasse zurückgibt. Zum Beispiel löst der Verbraucher eine Aktion aus, wenn ein Dienststatus gestartet, gestoppt, erstellt oder entfernt wird.
- Binden des Ereignisfilters an den Verbraucher – Der Klebstoff, der die Windows WMI-Abfrage mit dem Verbraucher verbindet. Die Bindung benachrichtigt den Verbraucher, wenn der Ereignisfilter eine Übereinstimmung erhalten hat.
Wenn Sie alle diese Elemente zusammenfügen, erstellen Sie ein Abonnement.

Erstellen der WQL-Abfrage
A WQL query for a WMI event looks a bit different than performing a simple query with Get-CimInstance
. Below you’ll find a typical WMI event query.
Da die WQL-Abfrage auf den ersten Blick einschüchternd aussehen kann, wollen wir sie aufschlüsseln und verstehen, wie jede Komponente funktioniert.
Die Systemklasse
In dem Beispiel mit Get-CimInstance
haben Sie festgestellt, dass Sie benachrichtigt werden möchten, wenn eine Änderung an einer Instanz in der Klasse Win32_Service
vorgenommen wird. Sie benötigen immer noch diese Klasse, aber anstatt einer WQL-Abfrage, die so aussieht:
Stattdessen beginnt die Abfrage wie folgt. Die Hauptklasse, die abgefragt wird, ist nicht die Klasse, die die Instanz enthält, über die Sie benachrichtigt werden möchten. Stattdessen handelt es sich bei der Klasse um eine Systemklasse.
Systemklassen sind interne Klassen, die den Typ der Änderung repräsentieren, die das Ereignis verursacht. Ein WMI-Ereignis hat vier Arten von Systemklassen:
- InstanceModificationEvent – Überprüft Änderungen des Eigenschaftswerts an einer Instanz in einer Klasse. Diese Klasse wird verwendet, da Sie den Eigenschaftswert
Status
einer Instanz (Dienst) der KlasseWin32_Service
überwachen möchten. - InstanceCreationEvent – Überprüft das Erstellen neuer Instanzen. Wenn Sie beispielsweise nach neu erstellten Diensten suchen möchten, verwenden Sie diese Systemklasse.
- InstanceDeletionEvent – Überprüft das Entfernen von Instanzen. Wenn Sie beispielsweise nach entfernten Diensten suchen möchten, verwenden Sie diese Systemklasse.
- InstanceOperationEvent – Diese Systemklasse überprüft alle Ereignistypen: Änderung, Erstellung und Löschung.
Für unser Überwachungsskript sieht der Anfang der WQL-Abfrage wie folgt aus:
WMI-Systemklassennamen beginnen immer mit zwei Unterstrichen (__) gefolgt vom Klassennamen.
Der Überprüfungszyklus
Dann haben wir den Überprüfungszyklus. Der Überprüfungszyklus enthält das Schlüsselwort within
und einen Wert, der das Abfrageintervall in Sekunden angibt.
WMI-Ereignisse sind nicht in Echtzeit, daher müssen Sie für Ihr Abonnement ein bestimmtes Intervall festlegen, um nach Änderungen zu suchen. Wenn Sie zum Beispiel den Überprüfungszyklus auf 10 setzen, wird das Abonnement alle 10 Sekunden nach einer Änderung seit dem letzten Abfragezyklus suchen. Wenn eine Änderung gefunden wird, wird der Verbraucher ausgelöst.
Wenn eine Instanz innerhalb des Abfrageintervalls geändert, erstellt oder entfernt wird, wird die Änderung nicht erkannt! Berücksichtigen Sie die benötigte Frequenz, stellen Sie jedoch sicher, dass sie die CPU und den Speicher nicht überlastet!
Für das Beispiel zur Überwachung von Diensten in diesem Tutorial setzen wir den Überprüfungszyklus auf 10, um alle 10 Sekunden nach einer Änderung in einem Windows-Dienst zu suchen. Die WQL-Abfrage wird immer länger!
Der Filter
Zum Abschluss der WQL-Abfrage müssen Sie einen Filter definieren, um die zurückgegebenen Instanzen der Systemklasse einzuschränken. Sie müssen den Filter wie unten angegeben definieren. In diesem Fall heißt die zu überwachende CIM-Klasse TargetInstance
.
ISA
ist ein Operator, der eine Abfrage auf die Unterklasse einer angegebenen Klasse anwendet.
Da das Tutorial ein Abonnement zur Überwachung von Windows-Diensten erstellt, würde der Filter wie folgt aussehen:
Wie es ist, sucht der Filter nach alleninstanzen von Win32_Service
. Wenn Sie nur eine einzelne Eigenschaft überwachen möchten, vielleicht einen bestimmten Dienst, verwenden Sie den AND
-Operator.
Die AND– oder OR-Operatoren fügen weitere Bedingungen hinzu, um genauere Ergebnisse zu erzielen.
Der Tutorial-Filter (und die gesamte Abfrage) ist jetzt vollständig, wie im folgenden Code-Snippet gezeigt.
Erstellen des Ereignisfilters
Jetzt, da Sie den Abfragefilter haben, ist der Rest des Prozesses viel einfacher zu verstehen! Sie müssen nun den Ereignisfilter erstellen, um diese Abfrage zu verwenden. Ein Ereignisfilter ist tatsächlich eine weitere CIM-Instanz, die Teil der __EventFilter
-Klasseim Root/subscription
-Namensraum ist.
Nachfolgend finden Sie einen Code-Ausschnitt mit allem, was Sie benötigen. Das unten stehende Skript weist die WQL-Abfrage der Variable $FilterQuery
zu. Es erstellt dann eine Hashtable, die jede der erforderlichen Eigenschaften und Werte für den Ereignisfilter enthält. Anschließend wird das Cmdlet New-CimInstance
ausgeführt, um den Ereignisfilter endgültig zu erstellen.
Die resultierende CIM-Instanz wird dann in einer Variable ($CIMFilterInstance
) für spätere Verwendung gespeichert.
Führen Sie nun Get-CimInstance
aus, um zu überprüfen, ob die neue CIM-Instanz von __EventFilter
erstellt wurde.

Erstellen des Verbrauchers
Als nächstes ist es an der Zeit, den Verbraucher oder die Aktion zu erstellen, die ausgeführt wird, wenn Windows das WMI-Ereignis auslöst. Beim Erstellen des Verbrauchers haben Sie einige Optionen, abhängig von der Art der auszulösenden Aktion.
- ActiveScriptEventConsumer – Führt ein Skript in einer beliebigen Skriptsprache wie VBscript aus.
- CommandLineEventConsumer – Startet einen Prozess.
Stellen Sie sicher, dass die Zugriffssteuerungsliste (ACL) der ausführbaren Datei korrekt definiert ist, um zu verhindern, dass jemand die EXE durch eine bösartige Binärdatei ersetzt.
- LogFileEventConsumer – Erstellt ein Textprotokoll.
- NTEventLogEventConsumer – Schreibt ein Ereignis in das Windows-Ereignisprotokoll.
- SMTPEventConsumer – Sendet eine E-Mail.
In diesem Tutorial verwenden wir den Verbrauchertyp LogFileEventConsumer
, um in eine Protokolldatei zu schreiben, wenn der im WQL-Abfrageausdruck übereinstimmende Dienst geändert wird.
Jede Verbraucherklasse hat ihre eigenen Parameter, daher überprüfen Sie die
CimClassProperties
für weitere Details zu jeder Klasse, z. B.(Get-CimClass -ClassName __NTEventLogEventConsumer).CimClassProperties
.
Sobald Sie den Verbraucher erstellt haben, überprüfen Sie erneut mit Get-Ciminstance
, ob er existiert.

Verbindung der Ereignisfilter und des Verbrauchers
Schließlich ist es an der Zeit, dieses Abonnement abzuschließen und den Ereignisfilter und den Verbraucher miteinander zu verbinden! Wie Sie vielleicht vermutet haben, bedeutet das Erstellen der Verbindung das Erstellen einer weiteren CIM-Instanz. Dieses Mal müssen Sie eine neue Instanz in der Klasse __FilterToConsumerBinding
erstellen.
Der untenstehende Codeausschnitt verwendet die zuvor erstellten beiden Instanzen (den Filter und den Verbraucher) als Hashtable, die die zum Erstellen einer neuen Instanz erforderlichen Eigenschaften definiert. Er wird dann wie zuvor an New-CimInstance
übergeben, um die Verbindung zu erstellen.
Wie immer bestätigen Sie die Erstellung der Verbindung, indem Sie erneut Get-CimInstance
ausführen.
Wie Sie sehen können, enthält die Verbindung Informationen sowohl über den Filter
als auch über den Verbraucher
.

Testen des Abonnements
Sie sind endlich fertig! Es ist Zeit, die Früchte Ihrer Arbeit zu testen! Das Einzige, was Sie jetzt tun müssen, ist den Status des BITS-Dienstes zu ändern, um zu sehen, ob PowerShell einen Eintrag in die Protokolldatei unter C:\MyCIMMonitoring.txt schreibt.
Je nach Status des BITS-Dienstes stoppen, starten oder einfach neu starten Sie ihn mit dem Befehl Restart-Service
.
Warten Sie etwa 10 Sekunden und überprüfen Sie die Datei C:\MyCIMMonitoring.txt. Sie sollten jetzt den Text
in der Protokolldatei sehen, die Sie beim Erstellen des Consumers definiert haben.

Um alle WMI-Ereignisaktivitäten zu überwachen, werfen Sie einen Blick auf das Windows-Ereignisprotokoll im Pfad Anwendungs- und Dienstprotokoll\Microsoft\Windows\WMI-Activity\Operational.
Anhalten und Aufräumen des Abonnements
Wenn Sie mit dem Abonnement fertig sind, ist es Zeit, es zu bereinigen. Um das WMI-Ereignisabonnement zu stoppen und zu entfernen, müssen Sie die Ereignisfilter-, Consumer- und Bindungsinstanzen entfernen.
Entfernen Sie den Ereignisfilter, indem Sie zuerst die Instanz mit Get-CimInstance
finden.

Entfernen Sie anschließend den Consumer auf die gleiche Weise.

Entfernen Sie schließlich die Bindung. Die Eigenschaft zum Auffinden der Bindung ist etwas anders. Anstelle der Eigenschaft Name
hat die Bindungsinstanz eine Eigenschaft Filter
, die tatsächlich ein Objekt mit einer Eigenschaft Name
ist.

Zusammenfassung
WMI/CIM ist ein praktisches und leistungsstarkes System zum Auffinden von Informationen über Windows und zum Überwachen von Windows mit WMI-Ereignissen. Die Überwachung von Änderungen mit WMI-Ereignissen bietet eine hervorragende Übersicht und eine schnellere Reaktion auf mögliche Probleme, was die Automatisierung einer Reaktion auf jedes Ereignis erleichtert.
Für ein großartiges Beispiel in der realen Welt, schau dir Wie man Active Directory-Änderungen mit WMI-Ereignissen verfolgt an.
Source:
https://adamtheautomator.com/your-goto-guide-for-working-with-windows-wmi-events-and-powershell/