Ereignisse in einer Remote-Session weiterleiten

Die PowerShell bietet bereits seit der Version 2.0 einen leistungsfähigen Ereignismechanismus. Zum einen lassen sich relativ Events von Objekten auswerten, die auf vordefinierten Klassen wie System.Timer oder System.IO.FileWatcher basieren. Interessant wird es beim Thema Event-Weiterleitung („Forwarding“) aus einer Remoting-Session. Damit kann jedes im Rahmen der Remoting-Session entstandene Ereignis lokal ausgewertet werden. Zuständig ist der unscheinbare Forward-Parameter beim Register-ObjectEvent-Cmdlet. Da das Thema in der PowerShell-Hilfe etwas zu kurz kommt (das einzige Beispiel verwendet WMI-Events), habe ich im Folgenden ein kleines Beispiel zusammengestellt. Dabei wird per PS-Remoting ein FileSystemWatcher auf einem Remote-Computer eingerichtet. Wird ein Ereignis ausgelöst, z.B. weil in dem überwachten Verzeichnis eine Datei angelegt wurde, wird das Event an den lokalen Computer weitergeleitet und führt dort zur Ausgabe einer Meldung, in der u.a. der Name des betroffenen Verzeichnisses enthalten ist.

Im ersten Schritt wird die Remoting-Session angelegt. Die Befehlsfolge richtet den FileSystemWatcher für das Verzeichnis C:\Temp ein. Anschließend werden per Register-ObjectEvent-Cmdlet die Ereignisse „Created“ und „Deleted“ registriert. Es wird keine Aktion angegeben, da diese lokal ausgeführt werden soll. Stattdessen erhält jede Registrierung lediglich einen Source Identifier. Der wichtigste Parameter ist Forward. Er bewirkt, dass ein Ereignis an den lokalen Computer weitergereicht wird. Der Parameter MessageData ist optional. Über ihn lassen sich beliebige Daten mit dem Event übergeben. In diesem Beispiel ist es lediglich der Name des Remote-Computers.

Im zweiten Schritt werden die beiden Ereignisse mit den Source Identifiern „TempWatch1“ und „TempWatch2“ auch lokal registriert. Da es in diesem Fall kein Objekt mit einem Event gibt, wird das Ereignis nicht per Register-ObjectEvent, sondern per Register-EngineEvent registriert, da es hier keinen InputObject-Parameter gibt. Per Action-Parameter wird der Scriptblock festgelegt, der lokal ausgeführt wird, wenn aus der Remote-Session ein Ereignis gemeldet wird.

Im nächsten Schritt wird der Scriptblock definiert, der immer dann ausgeführt werden soll, wenn aus der Remote-Session ein Ereignis gemeldet wurde.

Im Unterschied zu einer rein lokalen Ereignisverarbeitung muss bei der EventArgs-Variablen die Eigenschaft SerializedRemoteEventArgs „zwischenschaltet werden, um an die Ereignisargumente heranzukommen. Bei der Variablen Event ist das nicht erforderlich.

Zum Schluss wird die PS-Remoting-Session gestartet. Da das Ereignis zu einem späteren Zeitpunkt eintritt, z.B. wenn irgendwann eine Datei in dem überwachten Verzeichnis angelegt oder gelöscht wird, wird die Remoting-Session explizit per New-PSSession angelegt und nicht implizit und der Scriptblock für das Einrichten des FileSystemWatchers wird per Invoke-Command gestartet.

Wird jetzt auf dem Remote-Computer im überwachten Verzeichnis eine Datei angelegt oder gelöscht, wird das resultierende Ereignis an den lokalen Computer weitergeleitet und führt zur Ausgabe einer Meldung, da der Scriptblock, der über die Variable SBAction festgelegt wird, ausgeführt wird.

Hier noch einmal das komplette Beispiel auf einen Blick.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.