Reportweb - Prinzip

Funktionen wie das Exchange Control Panel (ECP) und RBAC sind ja prädestiniert, verschiedene administrative Tätigkeiten zu delegieren. Nur welcher Teilzeitadministrator installiert sich eine Exchange Management Console oder sogar noch die PowerShell, um seine RBAC-Rollen auszuüben. Oft benötigt er  oder ein weniger privilegierter Benutzer auch nur ein paar Informationen ohne gleich etwas zu verändern, z.B. welche Mailboxen "zu groß" sind, welche Queues gerade "voll" sind, wie es um seine DAG steht, welche Migrationen gerade aktiv sind und vieles mehr.

Vereinfachte Darstellung

Um diese Informationen bereit zu stellen, hatte ich mir eine einfache und hoffentlich für jeden verständliche Lösung überlegt:

  • Ein PowerShell-Skript (2) wird regelmäßig gestartet und liest die erforderlichen Informationen aus den Quellen (1) aus.
  • Diese Informationen bereitet es entsprechend auf und schreibt als Ausgabe eine statisch HTML-Datei (3)
  • Diese Datei kann ein autorisierter Anwender über seinen PC und den Browser (4) einfach anzeigen.

Der Anwender kann nicht eingreifen, sondern sieht nur statische Inhalte. Über den Taskplaner würde vorgegeben, wann und wie oft ein Report erstellt wird. Die vereinfachte Darstellung ist natürlich nur ein erster Einstieg, denn schon schnell möchte man mehrere Reports erstellen oder alle Reports das gleiche "Look and Feed" verpassen. Also kommen HTML-Vorlagen und CSS-Stylesheets dazu, in die die Daten eingebunden werden.

Der Generierungsprozess

Spätestens wenn mehrere Reports zu erstellen sind, wird man nicht in jedem PowerShell-Skript den gleiche Code zur Generierung der Ausgabe codieren. Auch sollte der Code, der die Daten ermittelt nicht die finale komplette HTML-Seite erstellen müssen. Er könnte eine HTML-Vorlage nutzen, die Ergebnisse "einbinden" und dann als neue Datei wegschreiben. So lässt sich auch das "Aussehen" etwas "schicker" gestalten. Ich habe daher die Generierung in mehrere PowerShell-Skripte und eine CMD-Datei aufgeteilt, die über den Taskplaner gestartet werden.

  • Reportweb.cmd
    Der Taskplaner startet angegebene Programme. Nur bei PS1-Dateien ist der Default Handler leider nicht PowerShell.exe sondern Notepad. Damit die Aufrufe im Taskplaner übersichtlich sind, habe ich mir daher erlaubt eine CMD-Datei bereit zu stellen, die mit einem Parameter die PowerShell Skripte startet. Sie müssen Sie nicht nutzen aber mir erleichtert es die Arbeite.
  • ReportWeb-Worker
    Dies ist der "Arbeiter" und wird vom Controller mit dem Reportnamen gestartet. Er schafft die LaufzeitUmgebung, und startet den Report. Die Rückgabe wird genutzt, um diese in eine Vorlagen einzubauen und die Ausgabe in eine Datei zu speichern.
  • Reportweb-Controller
    Dieses Programm liest die Liste der Reports und startet anstehende Jobs, die entweder angestoßen wurden oder wieder an der Reihe sind. Über eine LOCK-Datei stellt das Skript sicher, dass immer nur ein "Controller" gleichzeitig läuft. Es startet die anstehenden Reports durch den Worker. Es prüft die Anzahl der aktiven Worker und startet nie mehr als "MaxWorker" parallel, um das System nicht zu überlasten. Zudem macht es eine 5 Sek pause nach dem Start eines Workers. Dieses Skript wird z.B. vom Taskplaner alle 5 Minuten gestartet.
  • Reportweb-Trigger
    Dieses Skript von vom Taskmanager bei einem Eventlogeintrag gestartet und legt eine TRIGGER-Datei an, die den Reportweb-Controller anweist, den Report zu generieren.
  • Taskplaner
    Der Taskplaner ist hier nicht gesondert abgebildet, der ja zum Betriebssystem gehört. Aber ich nutzen ihn um zum einen den Trigger zu starten aber insbesondere auch um den Controller permanent laufen zu lassen, der nach Triggerdateien sucht und entsprechend seines eigenen Zeitplans die entsprechenden Reports über den Worker ausführen lässt.

Hier noch mal als Bild:

Die Aufteilung, die erst später umgesetzt wurde, erlaubt auch den parallelen Aufruf von "Generate-Report". Es kann z.B. "Langläufer" geben, die einige Stunden bis zum Abschluss benötigen. In ersten Versionen wurden die Reports sequentiell aufgerufen. Die parallele Abarbeitung ist flexibler und blockiert Reports nicht mehr. Dafür müssen andere Dinge berücksichtigt werden.

Komponenten

Ehe das alles funktioniert, müssen aber ein paar Dinge ineinander greifen. Leider habe ich keinen "Installer" oder ein Setup. Aber es ist nicht schwer, da im wesentlichen nur Bordmittel zum Einsatz kommen:

  • Browser
    Auf dem Arbeitsplatz nutzen die Anwender einen handelsüblichen Browser zum Anzeigen der Informationen
  • IIS für statische Seiten
    Der Webserver stellt die Dateien per HTTP/HTTPS bereit. Es handelt sich überwiegend um statische Webseiten. Der Webserver muss also weder ASP/ASPX noch CGI, PERL o.ä., unterstützen. Das beschränkt natürlich den Einsatzbereich auf regelmäßig erstellte Informationen, die natürlich nicht "sekundengenau" aktuell sein können. Wer aber die Funktion Reportweb Trigger nutzen will, muss zumindest ASPX bereit stellen.
  • PowerShell
    PowerShell 2.0 ist die Umgebung, unter welcher die Skripte ablaufen, die Daten ermitteln und Ausgaben erzeugen. Wenn bestimmte Module andere Hilfsmitteln benötigen (z.B. Exchange, Lync, QuestAD-Tools o.ä.) dann sind diese zu installieren oder als Remote PowerShell einzubinden.
  • HTML Vorlagen und HTML-Editor zum Anpassen
    Der Worker baut die Ergebnisse in eine Vorlage ein. Daher sollten Sie z.B. mit Sharepoint Designer oder einem anderen Programm eine schicke Vorlage bauen, die z.B. auch auf die Reports verweist. Beachten Sie dabei die Details auf Vorlage
  • Windows Taskplaner
    Den brauche ich, um die Reports regelmäßig zu generieren oder auf Trigger zu reagieren.

Weitere Links

  • Reportweb Pfade
    Die Skripte, HTML-Reports und andere Dateien verteilen sich in verschiedenen Verzeichnissen
  • Reportweb Vorlage
    Wie greifen DWT und HTML-Vorlage ineinander um die Reports zu formatieren
  • Reportweb:Controller
    Dieses PowerShell-Script startet gemäß der Reportliste, Zeitplänen und Triggern die Reports an
  • Reportweb:Worker
    Dieses Modul wird einmal je Report gestartet und schafft die LaufzeitUmgebung, startet das Reportmodul, sammelt die Ergebnisse ein und generiert die HTML-Ausgabedatei
  • Reportweb:Taskplaner
    Eine zentrale Komponente um die Reports überhaupt auszuführen
  • Reportweb:Trigger
    Diese Seite beschreibt die Methode, um Reports auch per Browser aus der Ferne auszulösen.