Hiermit starte ich einen zweiteiligen Artikel zu Architektur, Managementfunktionen und PowerShell! Im Teil 1 geht es um die Erstellung von einfachen Cmdlets für die PowerShell und im Teil 2 geht es um die Integration in eine Anwendungsarchitektur. Ich setzt die Kenntnis der PowerShell voraus (Verb-Noun; PowerShell Hosting Engine; Import-Module; .NET Assembly).
Teil1
Entwicklerbrille: Als Entwickler macht man sich in Projekten viele Gedanken zur Anwendungsarchitektur, über Programmiersprachen, nutzbaren Frameworks, Schnittstellen, UserExperience, … . Was kann uns die Entwicklung vereinfachen und dem Kunden eine tolles Softwareerlebnis bieten? Ich spare mir hier die übliche Auflistung von Beispielen wie Angular, TypeScript, BootStrap, ASP.NET MVC u.v.m. Ist die Anwendung ausgeliefert und in den Betrieb übergeben, sind viele Entwickler raus.
Das ist falsch!
Denn auch im Betrieb gibt es das ein oder andere, was wir als Entwickler für die lieben Admins tun können. Das Zauberwort heißt Managementfunktionen!
Vom Entwickler angebotene Managementfunktionen könnten z.B. als REST API angeboten werden, was der Entwickler für die Anbindung einer Client-Web-Anwendung an das Hintergrund-(Server-)System sowieso erstellt. Jedoch ist PowerShell bestens geeignet für viele administrative Aufgaben und in Admin-Kreise noch weit vertreten.
Die Erstellung eines eigenen Cmdlets ist dabei sehr einfach und mit wenigen Handgriffen erledigt:
- Im Visual Studio eine Klassenbibliothek erstellen bzw. dem eigenen Software Projekt hinzufügen.
- Zur Bereitstellung von Cmdlets müssen wir unsere Klasse von Cmdlet aus dem Namespace System.Management.Automation ableiten. Die Referenz erhält man entweder vom eigenen Rechner oder über NuGet. In NuGet nach Microsoft PowerShell suchen und dort die aktuellste Version dem Projekt hinzufügen.
Im Anschluss ist ein Verweis auf das Assembly System.Management.Automation.dll aus dem Packages Ordner hinzuzufügen.
- Jetzt können wir unser erstes Cmdlet erstellen. Ich habe den Code bei einem Vortrag bei der PowerShell UserGroup Hannover verwendet, deshalb beginnt der Namespace mit Psugh:
using System; using System.Management.Automation; namespace Psugh.Buchung.PowerShell.Demo1 { [Cmdlet(VerbsCommon.Get, "CurrentTime")] public class GetCurrentTimeCommand : Cmdlet { protected override void ProcessRecord() { WriteObject("Es ist " + DateTime.Now.ToString() + "!"); } } }
- Nach dem Kompilieren erhält man im bin/debug-Verzeichnis das Assembly. Dieses Modul ist nun in PowerShell zu importieren und das programmierte Cmdlet Get-CurrentTime aufrufen:
PS C:\Projekte\PSUGH\Buchung\PowerShell\PowerShell\bin\Debug> Import-Module .\Psugh.Buchung.PowerShell.Demo1.dll PS C:\Projekte\PSUGH\Buchung\PowerShell\PowerShell\bin\Debug> Get-CurrentTime Es ist 19.02.2018 23:05:57!
Ergebnis in der PowerShell: