PowerShell 6.0 Core ist offiziell

Den Blog-Eintrag des PowerShell-Teams wird sicherlich jeder schon gelesen haben:

https://blogs.msdn.microsoft.com/powershell/2018/01/10/powershell-core-6-0-generally-available-ga-and-supported/

Die Open Source-Version der PowerShell ist unter dem Namen PowerShell Core 6.0 endlich offiziell. Das PowerShell-Team hat damit eine herausragende Arbeit abgeliefert. Herzlichen Glückwunsch!

Die wichtigste Nachricht für alle Administratoren, die die PowerShell in erster Linie als Werkzeug für die Windows-Administration sehen: Die Windows PowerShell 5.1 (und auch die ISE) wird es „ewig“ als fester Bestandteil von Windows geben, die neue PowerShell kann problemlos parallel betrieben werden. Anders als die Windows PowerShell wird sie als portable Anwendung in das Programme-Verzeichnis kopiert. Damit wäre es z.B. auch kein Problem, die Version 6.0 parallel zu einer Version 6.1 zu betreiben, die irgendwann als Nachfolger auf der Bildfläche erscheinen wird.

Auch wenn die neue PowerShell 6.0 in naher Zukunft eher eine Randnotiz sein wird, da ihr im Vergleich zur PowerShell 5.1 ein paar wichtige FUnktionalitäten zwangsläufig fehlen (Stichwort: WMI) und es unter Windows für Administratoren eigentlich keinen Grund gibt sie zu verwenden, markiert sie einen Meilenstein in der Entwicklung der Microsoft Systemadministrationstools.

Bemerkenswert ist die neue PowerShell weniger aufgrund irgendwelcher Eigenschaften (sie kann bis auf die SSH-Unterstützung für PS-Remoting ja deutlich weniger als die PowerShell 5.1), sondern durch die Art und Weise wie das PowerShell Team unter der Leitung von Joey Aiello das Open Source-Projelt umgesetzt haben.

Natürlich ist das erst der Anfang. Zusammen mit der Community wird die PowerShell in den kommenden Jahren immer besser. The sky is the limit.

Silvesterfeuerwerk über Leipzip

Die Open Source-PowerShell 6.0 Core ist endlich fertig – ein Dank an das PowerShell-Team und die Community

Tipp: Über die ISO-Datei an die Versionsnummer eines Windows-Image herankommen

Wer Windows 10 über das Media Creation Tool herunterlädt, erhält eine ISO-Datei mit dem unscheinbaren Namen Windows.iso. Nicht sehr aussagekräftig. Auch wenn man davon ausgehen darf, dass dies stets die aktuelleste offizielle Windows 10-Version ist, ein paar Wochen später ist das eventuell nicht mehr so eindeutig.

Natürlich kann man die Versionsnummer, zusammen mit vielen anderen Details, abfragen. Entweder per Dism.exe oder per Get-WindowsImage aus dem Dism-Modul.

Die PowerShell muss dazu als Administrator gestartet werden. Für beide Aufrufe wurde die Iso-Datei als Laufwerk gemounted. Dazu genügt ein Doppelklick auf die Datei.

oder

In beiden Fällen ist die Build-Nummer, z.B. 16299, Teil der Ausgabe.

Ein wenig kurios ist, dass der Index einmal 1 und einmal 7 ist, aber das wird schon seine Gründe haben;)

Aus aktuellem Anlass: Spectre und Meltdown-Check per PowerShell-Modul

Man glaubt zwar immer nach den „Skandalen“ der jüngsten Vergangenheit, dass es in Bezug auf Sicherheitslücken in IT-Systemen nicht schlimmer kommen kann, aber dann kommt es doch noch schlimmer. Ein Fehler auf der Ebene der CPU (Stichwort: „Speculative Execution side-channel attacks“), der Angreifern theoretisch einen Lesezugriff auf eigentlich geschützte Bereiche des Arbeitsspeichers ermöglicht, ist für mich ein Super-GAU. Da hilft auch alles Relativieren nichts. Auch wenn sich konkrete Schadensfälle in Grenzen halten werden, da weltweit die Mehrheit der Systeme in den nächsten Tagen ein Update erhält, ist die psychologische Auswirkung mehr als bedenklich.

Wozu sich noch um Sicherheitskonzepte, Benutzerkonten, Tokens und Claims Gedanken machen, wenn die komplette Sicherheit durch ein Einfallstor ausgehebelt wird, das in Zukunft immer wieder auftreten kann. Das ergibt sich aus der enormen Komplexität moderner CPUs. Hinzu kommt, dass der Fehler offenbar schon viele Jahre existierte und offenbar erst kurzem von einem Forscherteam der TU Graz entdeckt wurde als sie gehäuft aufgetretene Angriffsszenarien näher untersuchten.

Da über die Thematik in den letzten Tagen schon sehr viel geschrieben wurde, will ich nicht auch noch meinen Senf basierend auf Halbwissen und Vermutungen dazu geben. Auf Spiegel Online habe ich eine gute Zusammenfassung gefunden:

http://www.spiegel.de/netzwelt/gadgets/spectre-und-meltdown-die-wichtigsten-antworten-zu-den-schwachstellen-in-prozessoren-a-1186193.html

Ansonsten natürlich Heise-News mit einem ausführlichen und sehr lesenswerten Artikel von Andreas Stiller, Golem.de usw.

In ein paar Wochen dürfte das Thema ohnehin wieder vergessen sein. Wer macht sich denn aktuell noch über die Bedrohungen des letzten Jahres wie „WannaCry“ und die daraus eigentlich zu ziehenden Konsequenzen Gedanken? Bis zum nächsten Störfall will man vermutlich möglichst wenig Grundsätzliches in Frage stellen.

Wer testen möchte, ob eine CPU anfällig ist für Spectre und Meltdown kann ein PowerShell-Modul von Matt Miller von der PowerShell Gallery installieren, das Microsoft seit dem 4. Januar 2018 zur Verfügung stellt. Voraussetzung ist PowerShell ab Version 5.0. Und natürlich muss die Skriptausführung möglich sein. Wer sich bislang den Luxus gönnte mit einer älteren PowerShell-Version zu arbeiten, muss das Modul als Zip-Datei direkt von der Projektseite herunterladen, „entsperren“ und dann die beiden Dateien in ein in einem Modul-Verzeichnis zuvor angelegtem Verzeichnis mit dem Namen „SpeculationControl“ kopieren.

Eine Projektseite für das Windows 10-Modul habe ich leider nicht gefunden, in der TechNet Script Gallery gibt es das Modul für Windows Server 2016 als Download:

https://gallery.technet.microsoft.com/scriptcenter/Speculation-Control-e36f0050

Das Modul lässt sich natürlich auch unter Windows 10 verwenden.

Liegt PowerShell ab version 5.0 vor, genügt ein

Das Modul wird dadurch nach %userprofile%\documents\windowspowershell\modules kopiert, so dass die PowerShell nicht als Administrator gestartet werden muss.

Anschließend wird die einzige Function wie folgt aufgerufen:

(für VMWare ist offenbar ein Patch erforderlich: https://twitter.com/lamw/status/949662333038559232)

Die Ausgabe des Befehls ist relativ technisch und mit zahlreichen Fachbegriffen versehen, man muss sie daher interpretieren können. Vereinfacht gilt, dass ein „false“ schlecht, ein „true“ gut. Hat man die aktuellen Patches (vor allem KB4056892) installiert, sollte die Mehrheit der Einstellungen einen true-Wert besitzen.

Microsoft beschreibt die Ausgaben auf der folgenden Webseite:

https://support.microsoft.com/de-de/help/4073119/protect-against-speculative-execution-side-channel-vulnerabilities-in

Das von Microsoft zur Verfügung gestellte Sicherheitsupdate hat die Nummer KB4056892. Wie es aussieht, muss es aktuell (Stand: 9/1/2018) bei Windows 10 noch direkt geladen werden:

http://www.catalog.update.microsoft.com/Search.aspx?q=KB4056892

Damit ein Virenscanner das Update nicht verhindert, gibt es unter der folgenden Adresse eine Liste mit Problemlösungen bei den einzelnen Produkten:

https://docs.google.com/spreadsheets/d/184wcDt9I9TUNFFbsAVLpzAtckQxYiuirADzf3cL42FQ/htmlview?sle=true#gid=0

Wie die Meltdown-Abfrage remote ausgefürt wird, wird unter der folgenden Adresse ausführlich beschrieben:

https://blogs.technet.microsoft.com/ralphkyttle/2018/01/05/verifying-spectre-meltdown-protections-remotely/

Mit der Schadensbegrenzung dürften die zuständigen Admins ein paar Tage beschäftigt sein. Insofern hat das neue Jahr „vielversprechend“ begonnen;)

PowerShell-Experten-Tipp: Array-Eigenschaften in Klassen

Eigenschaften in per class-Befehl definierten Klassen können einen beliebigen Datentyp besitzen, natürlich auch Array bzw. den Datentyp für ein mehrdimensionales Array mit Werten eines wiederum beliebigen Typs. Die Schreibweise für den Datentyp ist dieselbe wie bei einer Variablendeklaration, also z.B. [Double[,]] für ein zweidimensionales Array mit Double-Werten.

Das folgende Beispiel ist abstrakt und dient lediglich dazu, die Syntax zu veranschaulichen.

Ausgangspunkt ist eine Klasse M. Sie besitzt eine Property Prop1.

Die zweite Klasse N> besitzt eine Array-Property mit Objekten vom Typ N.

Der Eigenschaft Werte werden direkte Werte zugewiesen, das Array muss also nicht initialisiert werden.

Soll eine Klasse eine Eigenschaft besitzen, die auf einem zweidimensionalen Array basiert, wird für Schreibweise des Datentyps die bei der PowerShell allgemein übliche Schreibweise verwendet.

Außerdem muss die Property explizit per New-Object initialisiert werden, da ansonsten das Array nicht angelegt wird.

Tipp: Die Anzahl der Dimensionen liefert die rank-Eigenschaft des Array. Über die Methode GetUpperBound() erhält man die Obergrenze für eine bestimmte Dimension (0, 1 usw.).

Functions wie Functions aufrufen – über einen kleinen Umweg kein Problem

Eine der Grundideen bei der Planung und Umsetzung der PowerShell war damals, dass sie ein möglichst breites „Publikum“ ansprechen soll, und dass niemand gezwungen werden sollte vertraute Gewohnheiten und Schreibweisen beim Scripten aufgeben zu müssen.

Eine der dieser Gewohnheiten ist die bei anderen Skript- und Programmiersprachen übliche Form der Function-Definition und des Aufrufs einer Function. Demnach folgen auf den Befehl, der die Function definiert, die Parameter in runden Klammern:

Beim Aufruf der Function werden die Argumente ebenfalls in runden Klammern gesetzt:

Auch in PowerShell können Functions auf diese Weise definiert und aufgerufen werden, wenngleich dies eher eine Ausnahme ist. Die einzige Einschränkung besteht darin, dass eine Übergabe mehrerer per Komma getrennter Werte wie üblich die Übergabe eines Arrays bedeutet. Werden daher mehrere Werte übergeben, müssen diese als Array angesprochen werden.

Das folgende Beispiel ist nicht nur etwas umfangreicher, es behandelt auch einen Bereich, der im IT-Alltag eher selten vorkommt: Es geht um die Berechnung der Determinante von Vektoren mit zwei Komponenten und anderen Dingen, die etwas mit „analytischer Geometrie“ (aber eher auf dem Niveau des 11. Schuljahres) zu tun haben.

Im ersten Schritt werden lediglich zwei Klassen für Vektoren mit zwei und mit drei Komponenten definiert.

Die Klassendefinition wäre nicht erforderlich und setzt zudem PowerShell ab Version 5.0 voraus, aber mit den Klassendefinitionen wird das Beispiel insgesamt etwas besser nachvollziehbar.

Im nächsten Schritt kommen zwei Function-Definitionen zum Einsatz, über die Vektoren definiert werden:

Dass auf den param-Befehl verzichtet wird ist keine Voraussetzung, um die Function wie bei Programmiersprachen üblich aufrufen zu können. Wichtig ist lediglich, dass die Function einen Array-Parameter besitzt, dem alle Argumente übergeben werden.

Der Aufruf der Function v2 sieht wie folgt aus:

und

Mit den zweiten Vektoren wird im nächsten Schritt mit der Function det2 die Determinante der 2×2-Matrize ausgerechnet, die durch die beiden Vektoren gebildet wird. Auch diese Function wird so definiert, dass sie mit runden Klammern aufgerufen werden muss.

<# .Synopsis Determinante eines Vektors mit 2 Komponenten #>

function det2
{
param([Vektor2[]]$v)
return ($v[0].x * $v[1].y – $v[0].y * $v[1].x)
}

Beim Aufruf der Function det ist ein kleiner Umweg erforderlich: Der Rückgabewert muss einer Variablen zugewiesen werden. Ansonsten funktioniert die Multiplikation mit 0.5 oder einer anderen Zahl nicht. Warum das so ist, muss ich noch herausfinden (ich bin sicher, dass Friedrich die Antwort kennt;)

Fazit: Wer Functions bei PowerShell so verwenden möchte wie bei VBScript, JavaScript und den meisten Programmiersprachen kann dies tun. Eine Einschränkung besteht darin, dass wenn die Argumente per Komma getrennt übergeben werden soll, ein Array-Parameter benötigt wird.

Start-2018 – oder alles Gute in 2018

Nach meinen Weihnachtswünschen nun auch die wie immer von Herzen kommenden Wünsche zum neuen Jahr.

Start-2018

Start-2018 (Bildnachweis: Oliver Le Moal/IStockphoto.com)

Der Umstand, dass in Deutschland die Wirtschaft nach wie vor auf Wachstum ausgerichtet ist, dürfte sich auch positiv auf die IT-Branche auswirken. Bei Microsoft könnte es offenbar besser nicht laufen. Das Unternehmen hat die Gewinnnprognosen der Analysten im Jahr 2017 in jedem Quartal übertroffen, seinem geschätzten Börsenwert zufolge ist es das drittwertvollste Unternehmen weltweit nach Apple und Google, der Aktienkurs steigt und steigt, scheinbar hat man alles richtig gemacht.

Dieses Jahr kommen der Nachfolger von Windows Server inklusive zweier Updates, vermutlich wieder jede Menge neuer Azure-Dienste und vielleicht ein faltbares Surface-Notebook. Trotzdem sollte man gleich den Hörer auflegen falls einem eine vermeintliche Microsoft-Mitarbeiterin am Telefon ein Sicherheitsupdate installieren oder etwas gegen das zu lautes Gebläse unternehmen will (http://www.abendzeitung-muenchen.de/inhalt.az-serie-vorsicht-betrueger-20-stunden-in-den-faengen-der-microsoft-betrueger.ce529473-cf22-4e6d-87fb-5b5d9999c36c.html).

Das positive wirtschaftliche Umfeld dürfte sich auch positiv auf IT-Projekte in Unternehmen und Behörden auswirken. IT-Mitarbeiter sind gefragt und fehlendes Personal könnte sich langsam als Flaschenhals bei größeren Projekten erweisen.

Was die PowerShell angeht so sieht ebenfalls alles ganz entspannt aus:

>WMF 5.1 und damit auch die ISE werden nicht mehr funktional weiterentwickelt, bleiben aber immer ein fester Bestandteil von Windows

>Die Entwicklung fokusiert sich auf die PowerShell 6.0, die voraussichtlich bis Ende Januar offiziell verfügbar sein wird, gleichzeitig beginnt die Weiterentwicklung mit der Version 6.1. Diese PowerShell wird immer als separater Download verfügbar sein, nicht mehr als Update.

>Die PowerShell 6.0 ist aber funktional nur eine Untermenge der Version 5.1, da alles Windows-spezifische nicht dabei ist. Dazu gehören nicht nur die Registry, Systemdienste und WMI, auch eher profane Cmdlets wie Rename-Computer oder auch ConvertFrom-String. Insgesamt gibt es in der aktuellen Version nur knapp 200 Cmdlets was mich ein wenig an die PowerShell 1.0-Zeiten erinnert. Dafür läuft diese Version auch auf einem Rasberry PI.

>Insgesamt hat sich die Weiterentwicklung der PowerShell in den letzten zwei bis drei Jahren stark verlangsamt. Ein Grund ist natürlich, dass das PowerShell-Team mit der Umstellung auf Open Source voll beschäftigt war. Darunter leiden auch andere Projekte (u.a. das vielversprechende Phosphor-Projekt, das offenbar über die Initialversion noch nicht herausgekommen ist – hier ist natürlich auch die Community gefragt!)

>Im April wird es in Hannover wieder eine PowerShell Conference Europe geben (http://www.psconf.eu/). Themen und Sprecher dürften bis Ende Januar feststehen.

Ich wünsche allen, die diesen Blog-Eintrag im Januar lesen, ein gesundes und glückliches Jahr 2018!

Vielleicht sehen wir uns bei einer PowerShell-Schulung in München, Nürnberg, Hamburg oder Stuttgart,

Peter Monadjemi

Frohe Weihnachten

Ich wünsche allen Lesern meines PowerShell-Blogs frohe und gesegnete Weihnachten und die Zeit und vor allem innere Ruhe, um die Feiertage für die wichtigen Dinge im Leben nutzen zu können, weit weg vom Alltag mit seinen zahlreichen Verpflichtungen und Nebensächlichkeiten.

Peter Monadjemi

Weihnachten 2017 vor dem Reichstag in Berlin (auch ohne eine konstituierte Regierung ein schöner und vor allem friedvoller Anblick)

(Quelle: Fotalia.com/Urheber: sborisov)

PowerShell unter Linux installieren – bei einem traditionellen Provider als Alternative zu einer Azure-VM

Die PowerShell unter Linux zu installieren macht inzwischen richtig Spaß und setzt dank einer nahezu idiotensicheren Anleitung für die wichtigsten Linux-Disributionen unter https://github.com/PowerShell/PowerShell auch keinerlei Linux- oder Bash-Kenntnisse voraus. Ein wenig PowerShell-Kenntnisse genügen;)

Auch wenn es naheliegend ist, die Linux VM unter Azure anzulegen, diese Variante besitzt einen Nachteil, der sich mal mehr oder weniger auswirkt: Azure ist aus meiner Sicht relativ teuer. Eine einfache Linux-VM mit 2 Core CPU und 3.5 GB RAM kostet ca. 50€ pro Monat. Natürlich gibt es preiswertere Varianten, aber das Arbeiten soll ja auch etwas Spaß machen. Deutlich preiswerter sind die meisten traditionellen Provider. Hier gibt es eine virtuellen Linux-Server mit vollen Root-Rechten ab 9.99€ (etwa bei Host Europe, bei dem ich z.B. diesen Blog hoste).

Wer jahrelang den Komfort von Azure gewöhnt war, muss bei einem traditionellen Provider erst einmal umdenken. Man bestellt den Server, bekommt kurz danach die Auftragsbestätigung, muss dann einen Auftrag zur Startkonfiguration starten und bekommen dann etwas später die Zugangsdaten (eine gewisse Überraschung war es, dass es aufgrund interner Hardwareprobleme ein paar Tage gedauert hat – dies ist zwar die absolute Ausnahme, kann aber offenbar passieren).

Sobald man die Zugangsdaten in Gestalt einer IP-Adresse und einem generierten Kennwort für das root-Konto erhalten hat, geht es genauso weiter wie bei einer Azure-VM. Als SSH-Client verwende ich seit kurzem das hervorragende MobaXTerm (https://mobaxterm.mobatek.net).

Eine Besonderheit ist noch erwähnenswert: Auf einem nackten Linux-System fehlt am Anfang einiges, u.a. auch curl und das Package für den Download via HTTPS. Beide Packages müssen per apt-get install nachinstalliert werden:

Anschließend wird die PowerShell nach Anleitung installiert. Der Programmname lautet neuerdings pwsh und nicht mehr „powershell“.

Aktuell (Stand: November 2017) ist immer noch die Beta-9. Ich bin gespannt, ob die Version 1.0, wie es auf der PowerShell-Konferenz in Hannover im Mai angedeutet wurde, tatsächlich noch in diesem Jahr kommt.

PowerShell Core in einer Asp.Net Core-Anwendung hosten – die ersten Schritte

Gleich vorweg: Dies ist noch kein vollständiger Blog-Eintrag, es sind vielmehr nur mehr oder weniger zusammenhanglose Notizen, die allen weiterhelfen sollen, die an einem ähnlichen Projekt arbeiten und mir als eine Art „Notizzettel“ dienen sollen.

*** Letzte Aktualisierung: 11/11/2017 ***

Ich will in den nächsten Wochen ein umfangreicheres PowerShell-Skript über einen Websevice anbieten. Technisch ist das sehr einfach, wenn das Projekt auf ASP.NET basiert. Ich möchte das Projekt aber nur unter Asp.Net Core umsetzen, damit es theoretisch auch in einem Container unter Linux laufen kann. Warum nicht, auch wenn es für das Projekt im Moment keine konkreten Vorteile bietet?

Die Herausforderung besteht darin, dass PowerShell Core noch nicht immer nicht offiziell ist und es daher noch keine offiziellen Packages gibt. Ein Pendant zu System.Management.Automation ist das PowerShell Core SDK.

Einen guten Einstieg in die etwas komplizierte Thematik gibt der folgende Artikel:

https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell#net-core-sample-application

Im Folgenden beschreibe ich die Umsetzung des Projekts.

Ausgangspunkt ist ein leeres Verzeichnis. Vorausgesetzt werden VisuaL Studio Code (mit Visual Studio 2017 Community Edition ginge es zwar leichter, aber es soll ja nicht zu leicht sein) und die neueste Version des .NET Core SDKs, z.B. 2.02.

Die Downloaadresse ist https://www.microsoft.com/net/learn/get-started/windows

Schritt 1: Anlegen eines ASP.NET Core-Projekts vom Typ WebApi

Schritt 2:: Hinzufügen des PowerShell Core SDK-Package

*** Fortsetzung folgt ***

Nächstes Treffen der PowerShell User Group Stuttgart und Umgebung am 30.11.2017 Globalways/Gropiusplatz 2

Es gibt sie noch, die PowwerShell User Group Stuttgart, auch wenn es die letzten Monate eventuell etwas ruhig war um sie bzw. Facebook und Webseite nicht auf dem aktuellen Stand sind.

Und wann ist das nächste Treffen? Ganz einfach, bis auf Weiteres immer am letzten Donnerstag eines Monats. Wo erfahre ich mehr? Immer auf Meetup, also unter

https://www.meetup.com/de-DE/PowerShell-Usergroup-Stuttgart/

Eingeladen ist jeder, der sich für die PowerShell als ein enorm vielseitiges einsetzbares Werkzeug für die Adminstration unter Windows und neuerdings auch Linux interessiert.