Eine Webseite programmiert man in PHP oder einer anderen fürs Web spezialisierten Programmiersprache und macht diese über einen Webserver wie Apache, nginx oder den eher unbeliebten IIS verfügbar. Aber für kleine Aufgaben ist dies eventuell zu viel Overhead. Immerhin muss man hierfür unnötigerweise weitere Software auf dem Computer oder Server installieren.
Es reicht aber vielleicht auch ein einfaches PowerShell-Skript um einen Webserver zu starten bzw. eine Webseite über das http-Protokoll bereitzustellen. Wie du einen Webserver in der PowerShell bereitstellst erfährst du in diesem Artikel!
Webserver in der PowerShell als One-Liner!
Wenn mal eben schnell einen Webserver brauchst kannst du diesen Einzeiler verwenden um unter Port 5001 über http://localhost:5001 den Inhalt aus diesem html-Dokument („C:\ps.html“) anzubieten:
1 |
$httpListener = New-Object System.Net.HttpListener; $httpListener.Prefixes.Add("http://localhost:5001/"); $httpListener.Start(); while ($true){ $context = $httpListener.GetContext(); $context.Response.StatusCode = 200; $context.Response.ContentType = 'text/HTML'; $WebContent = Get-Content -Path "C:\ps.html" -Encoding UTF8; $EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent); $context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length); $context.Response.Close()} |
Den Webserver kann man einfach beenden indem man das PowerShell-Fenster schließt.
Webserver in der PowerShell
Hier ist die ausführliche Variante des Skripts um den Webserver unter Port 5001 zu betreiben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$httpListener = New-Object System.Net.HttpListener $httpListener.Prefixes.Add("http://localhost:5001/") $httpListener.Start() while ($true){ $context = $httpListener.GetContext() $context.Response.StatusCode = 200 $context.Response.ContentType = 'text/HTML' $WebContent = Get-Content -Path "C:\ps.html" -Encoding UTF8 $EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent) $context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length) $context.Response.Close() } |
Den auszugebenden html-Code kann man natürlich, wie auch unter PHP oder in anderen Sprachen, beliebig dynamisch zusammenbauen! Hierdurch ergeben sich vielfältige Möglichkeiten html-Output zu generieren.
Damit die Webseite die ganze Zeit durch den PowerShell-Webserver verfügbar ist, muss man die Ausgabe loopen. Ansonsten hört diese Ausgabe nach Absetzen des entsprechenden Befehls logischerweise wieder auf. Dazu nutzt man einfach eine Endlosschleife deren Bedingung auf ewig „true“ bleibt. Mehr zu Schleifen in der PowerShell und in der Kommandozeile erfährst du hier.
Wenn es aus irgendeinem Grund innerhalb des Skriptablaufs nötig sein sollte, kann man den http-Listener auch innerhalb des Skripts wieder schließen und der Port wird wieder freigegeben:
1 |
$httpListener.Close |
Webserver in der PowerShell im Hintergrund automatisch laufen lassen
Um den Webserver dauerhaft im Hintergrund laufen zu lassen und auch automatisch starten zu lassen, könnte man einfach eine Aufgabe im Taskplaner anlegen und das PowerShell-Skript automatisch beim Computerstart starten lassen. Oder man macht es richtig professionell und macht daraus sogar einen Windows Service.
http-Webserver mit PowerShell – Warum überhaupt?
Die PowerShell ist eine mächtige Skriptsprache und Befehlszeilen-Shell, die von Microsoft entwickelt wurde. Obwohl die PowerShell normalerweise eher mit der Systemadministration in Verbindung gebracht wird, kann man sie auch zur Erstellung eines http-Webservers verwenden. Natürlich ist das etwas „rudimentärer“ als einen richtigen Webserver zu verwenden, kann aber durchaus Sinn machen.
PowerShell-Webserver ist „leichtgewichig“ und einfach einzurichten
Die PowerShell ist eine sehr ressourcenschonende Skriptsprache, die auf jedem modernen Windows-System vorinstalliert ist. Das bedeutet, dass ein http-Webserver, der in PowerShell implementiert ist, immer ohne weiteren Aufwand genutzt werden kann. Im Gegensatz zu anderen Webservern wie dem Apache, die möglicherweise viel Overhead haben bzw. Installationsaufwand mit sich bringen, ist ein PowerShell-Webserver effizient und schnell einsatzbereit.
Flexibilität des PowerShell-Webservers
Außerdem bietet die PowerShell eine hohe Flexibilität und Anpassungsmöglichkeiten. Das bedeutet, dass der Webserver völlig nach deinen Bedürfnissen angepasst werden kann. Mit PowerShell kann man eigene Cmdlets und Funktionen schreiben, um den Webserver zu erweitern. Allerdings muss man hier vermutlich aufpassen, dass man das Rad nicht neu erfindet und am Ende einen Apache oder IIS in der PowerShell nachbaut. Wenn der Anwendungsfall zu komplex wird macht es vermutlich Sinn einen bereits existierenden vollwertigen Webserver einzusetzen.
Integration des PowerShell-Webservers mit anderen Microsoft-Produkten
Da die PowerShell von Microsoft entwickelt wurde, ist sie eng in andere Microsoft-Produkte integriert. Ebenfalls hat man von hier aus Zugriff auf das .Net-Framework und im Prinzip handelt es sich um eine vollständige Programmiersprache. Das bedeutet, dass man den Webserver nahtlos mit anderen Microsoft-Produkten wie Active Directory, Exchange Server und SharePoint nutzen kann.
Spannend ist in diesem Zusammenhang auch die Möglichkeit, die sich durch die Reaktion in der PowerShell auf Seitenaufrufe bzw. Interaktionen oder auch Parameter in der URL eröffnet. Hierdurch kann man beliebig Änderungen am System vornehmen oder alles andere machen was mit der PowerShell so möglich ist.
Hier ist in Beispiel wie man einen Aufruf von „http://localhost:5001/?id=write“ nutzen kann um bei der Angabe dieses Parameters in der URL einen Text im PowerShell-Fenster auszugeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$httpListener = New-Object System.Net.HttpListener $httpListener.Prefixes.Add("http://localhost:5001/") $httpListener.Start() while ($true) { $context = $httpListener.GetContext() $context.Response.StatusCode = 200 $context.Response.ContentType = 'text/HTML' $WebContent = Get-Content -Path "D:\test.html" -Encoding UTF8 $EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent) $context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length) # hier erfolgt die Prüfung auf den Parameter: if ($context.request.QueryString[0] -eq "write") { write-host "wenn dieser Parameter angegeben wurde erscheint dieser Text in der PowerShell-Konsole" } $context.Response.Close() } |
Fazit zur PowerShell als http-Webserver
Die Verwendung eines http-Webservers in PowerShell kann eine gute Option sein, wenn Sie einen leichtgewichtigen, einfach einzurichtenden, flexiblen und nahtlos in Microsoft-Umgebungen integrierbaren Webserver benötigen. Die PowerShell bietet alle notwendigen Werkzeuge und Funktionen, um einen robusten Webserver zu erstellen und zu verwalten. Wenn man also ein Windows-System verwendet und nur eine einfache Aufgabe für den Webserver hat, sollte man die Verwendung eines PowerShell-Webservers durchaus in Betracht ziehen.