PowerShell: Effektive Überwachungsrichtlinie ermitteln – Teil 3

Im Teil 1 haben wir herausgefunden, wie man mit P/Invoke und ein wenig C# die aktuell gültige Überwachungsrichtlinie sprachunabhängig (und, nebenbei bemerkt, ohne unnützes Daten-Beiwerk) ermitteln kann. Im Teil 2 nutzten wir PowerShell Remoting, um das ganze auf einem entfernten Rechner durchzuführen.

Doch was ist, wenn das PowerShell Remoting versagt oder nicht zur Verfügung steht? Manchmal blockieren Firmen und Organisationen WinRM generell, oder schränken es stark per Firewall ein. In dieser Situation haben wir, zumindest in der Windows PowerShell, noch ein Fallback-Protokoll: WMI. Mit der Create-Methode der Win32_Process-Klasse können wir auf einem entfernten Rechner einen Prozess starten. Das einzige Problem: Wir bekommen die Ausgaben nicht zurück, und schon gar nicht die schöne Hashtable, die uns das PowerShell-Remoting lieferte. In der Annahme, dass nur WMI als Übertragungsprotokoll zur Verfügung steht, müssen wir also dafür sorgen, dass das Ergebnis konserviert und abgerufen werden kann. Dazu gibt es mehrere Ansätze, ich entschied mich für die Registry. Die Hashtable wird also serialisiert (über ein PSCustomObject und Konvertierung nach JSON):

und in einen Registry-Wert gespeichert

Wie man die Registry dann per WMI abfragt, habe ich bereits hier vor einem Jahr untersucht. Es gibt hier aber drei Faktoren zu berücksichtigen:

  1. wir wollen den Code möglich universell und unabhängig vom Protokoll machen, das Speichern in der Registry ist aber nur bei WMI notwendig
  2. der WMI-Vorgang ist asynchron, das heisst, der Registry-Wert wird nicht sofort nach dem Prozess-Start geschrieben
  3. die Größe des Arguments bei Prozess-Start ist auf 8191 Zeichen begrenzt, und unser Skript-Block ist nicht ganz klein, wir müssen hier also haushalten.

Der folgende Code berücksichtigt diese ganzen Sachverhalte:

Die Technik mit „EncodedCommand“ macht unseren Aurgument-Wert durch die base64-Kodierung natürlich länger, erspart uns dafür jedoch die in diesem Fall sicher zum Scheitern verurteilte Behandlung der vielen verschachtelten Anführungszeichen.

Die Schleife am Ende des WMI-Teils läuft unbegrenzt, bis der Registry-Wert gefunden wird. Da sollte man natürlich einen Timeout einbauen, denn es kann ja sein, dass der Aufruf scheitert.

Happy Remoting!