PowerShell im Einsatz mit modernen Webanwendungen

Weltenbummler – JSON und PowerShell
Kommentare

Eigentlich sind die Zielsetzungen und Werkzeuge von Administratoren und Entwicklern sauber getrennt. Doch die Windows PowerShell (WPS) kann als administrative Skriptsprache und Konsoleninterpreter auch im Umfeld von Webanwendungen eine gute Figur machen. Testen von Rückgabewerten, Generieren von administrativ relevantem Content und Weiterverarbeitung vom Server-Response sind denkbare Anwendungsfälle.

Moderne Webapplikationen lagern oft einen Teil der Verarbeitungslast auf den Client aus. Die dort ablaufenden Skriptsprachen – im Wesentlichen JavaScript – erwarten nur strukturierte Daten vom Server. Je weniger O-verhead – umso besser. Da der „Datendump“ im Vordergrund steht, hat sich JavaScript Object Notation (JSON) als De-facto-Standard auf der Transportebene durchgesetzt. Nach der Spezifikation handelt es sich bei JSON um ein assoziatives Array (Hash) mit optionaler Mehrdimensionalität (Listing 1).

[
  {
    "MachineName":  "AT",
    "Index":  14725,
    "Message":  "OAB Download Succeeded."
  },
  {
    "MachineName":  "AT",
    "Index":  14724,
    "Message":  "Starting OAB download. (See event data)."
  },
  {
    "MachineName":  "AT",
    "Index":  14723,
    "Message":  "The Software Protection service has stopped.rn"
  }
]

Obwohl im Vergleich zu XML z. B. klar definierte Knotentypen und eine Lokalisierungssprache wie XPATH fehlen, wird JSON auf dem Webserver bevorzugt.

WPS und JSON – oberflächlich betrachtet

Die Windows PowerShell bot schon in früheren Versionen Befehle zum Im- und Export von XML-Dateien und -Strukturen. Doch erst in der aktuellen Version 3 wird JSON explizit berücksichtigt (Die Möglichkeiten über Zeichenkettenoperation JSON zu verarbeiten, vernachlässigen wir an dieser Stelle). Da die PowerShell primär als administratives Werkzeug designt ist, haben wir eine besondere Struktur vorliegen: Befehle wie CmdLets (verb-noun) oder Aliase (Verweise) sind vereinfachte Aufsätze auf das Typsystem von .NET und WMI. Sie haben also bei der Arbeit mit der WPS immer die Wahl zwischen der oberflächlichen Arbeit mit Befehlen und Parametern oder direktem Klassenzugriff. Die Befehle sind schematisch als Aktionsziele angelegt, wie „get-service“, „stop-Computer“ etc. Mithilfe der Anweisung

  • get-Command –noun json lassen sich so leicht alle Befehle zur Verarbeitung dieses Formats anzeigen.
  • get-help  JSON-Befehl –online liefert Ihnen alle Informationen bezüglich verfügbarer Parameter.

Tabelle 1: Cmdlets der WPS zur Verarbeitung von JSON

Befehl Funktion Parameter Verarbeitung
Convertto-JSON Erstellen einer JSON-Struktur auf Basis eines Eingangsobjekts

-depth

 

-Compress

Definiert die Strukturtiefe der abgebildeten Objekte. Standardwert ist 2

Steuert Normalisierung von Leerzeichen, Zeilen-umbrüchen, Tabs

ConvertFrom-JSON Erstellt ein PSCustomObject, die Schnittstellen werden aus den JSON-Wertpaaren ermittelt -InputObject Ein Feld kann dadurch statt über die Pipeline „nachträglich“ zur Verar-beitung gebunden werden

Fallbeispiel

Szenario: Ein Webservice (hier im Beispiel eine PHP-Anwendung) liefert uns benötigte Benutzerinformati-onen. Diese müssen in ein Zwischenformat CSV überführt werden, um ggf. daraus wieder Benutzer im Active Directory erstellen zu können

Schritt 1: Kontaktaufnahme

In diesem einfachen Beispiel ermittelt eine PHP-Anwendung benötigte Daten aus einer Datenbankabfrage. Diese werden dann in JSON kodiert. Um mit dem Server zu kommunizieren, nutzen wir eine geeignete .NET-Klasse. Da die WPS .NET-basierend ist, ist das kein Problem. Der Befehl new-object öffnet uns da ein Tor in die Weiten des .NET-Typsystems. Wir benötigen eine Klasse, die den HTTP-Request auslöst, damit wir die Antwort des Servers speichern können. Der Typ System.WebClient ist genau das, was wir brauchen. Die Anweisung

$web = New-Object  System.Net.WebClient 

erstellt das gewünschte Objekt.

Schritt 2: Paketannahme

Die Methode DownloadData() des Objekts ruft nachfolgend die JSON-Daten ab. Wir müssen diese nur entge-gennehmen und in ein PSCustomObjects konvertieren. Dies erledigt das CmdLet „ConvertFrom-JSON“ für uns. Wir übergeben dabei die Daten durch die Pipeline. Dank der „Intelligenz“ der WPS wird die erzeugte Variable automatisch richtig typisiert:

$response = $web.DownloadData("http://localhost/rest/json.php") | ConvertFrom-JSON;

Das erstellte Objekt sieht dann aus, wie in Abbildung 1 zu sehen.

Abb. 1: Struktur des „PSCustomObjects“

Die Daten sind nun aufbereitet, jetzt kann die WPS die Stärke aller administrativer Skriptsprachen ausspielen: Die Vermittlung zwischen Backend- und Frontend-Formaten. Mit Export-CliXml, Export-Csv, Convertto-Html stehen Ihnen dabei die Formate XML, CSV und HTML zur Verfügung!

…und zurück

Die Erzeugung JSON-kodierter Werte gestaltet sich sehr einfach. Seit Version 3 der PowerShell ist es nicht mehr nötig, die JSON.NET-Bibliothek zu laden. Einzig die Eingangsmenge, ob ein vorliegendes Array oder dynami-sche Systeminformation, müssen Sie bestimmen. Die nachfolgende Anweisung ermittelt alle Dienste und über-mittelt den Namen und Status als JSON-Objekt an eine Webanwendung:

$data = get-service | select-Object -Property name, status | ConvertTo-Json;
Invoke-RestMethod -Method Get -Uri "http://localhost/rest/rest.php?value=$data" -TimeoutSec 5;

Klassenfahrt

Wie schon erwähnt, ist alles in der WPS objektbasierend. Die Befehle und ihre Parameter sind nur ein einfach zu handhabender Aufsatz auf das .NET-Typsystem (unter anderem). Die zugrunde liegende Basis der hier vorgestellten JSON-Verarbeitung ist die JavaScriptSerializer-Klasse. Eine explizite Instanz können Sie in der PowerShell durch

$JSON = new-object  System.Web.Script.Serialization.JavaScriptSerializer 

anlegen. Das CmDlet „Get-Member“ listet uns den Bauplan davon auf (Abb. 2).

Abb. 2: Ausgabe von „$JSON | Get-Member“

Die Ergebnisse der Konvertierung sind aber einfache Zeichenketten.

Fazit

Immer mehr „verirren“ sich auch Entwickler in meine PowerShell-Kurse. Und wie man anhand der hier gezeig-ten JSON-Verarbeitung sehen kann – nicht ganz zu unrecht. Die PowerShell ist syntaktisch einfach und effizient aufgebaut und die „.NET Reflection“ gibt ihr die nötige Macht auch für anspruchsvolle Aufgaben.

Aufmacherbild: businessman holding globe, connected von Shutterstock / Urheberrecht: nopporn

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -