Archiv der Kategorie: PowerShell Core

$PSVersionTable.Platform -eq „Unix“ ? „Cool“ : „Windows, what else?“

Ich bin immer wieder fasziniert, wie selbstverständlich es ist inzwischen geworden ist, die PowerShell 7 unter einem Linux wie Cent OS 7 zu installieren. Die ganze Installation dauert noch nicht einmal eine Minute, wenn man die Installationsschritte von der Projektwebseite in die Konsole des SSH-Terminalfensters (ich empfehle MobaXTerm) kopiert.

Abb. 1. Die „Installationsanleitung“ für die Installation der PowerShell 7 unter CentOS

Ging alles gut, wird die PowerShell durch Eingabe von „pwsh“ gestartet. Der Rest ist selbsterklärend. Vielleicht nicht ganz, denn bei PowerShell 7 gibt es ein paar nette Neuerungen wie den sehr praktischen Tenäroperator ? (ergänzt durch ein :).

Abb. 2: Eine kurze PowerShell-Session unter Cent OS

Wer die Neuerungen der PowerShell 7 ausprobieren möchte, muss dazu natürlich kein Linux installieren. Die PowerShell 7 gibt es natürlich auch für Windows;)

PowerShell 7.0 unter Ubuntu – dank snap alles ganz einfach

Die PowerShell unter Linux zu installieren, ist grundsätzlich kein Problem, auf der Downloadseite ist die Installation bestens für alle Versionen und Varianten dokumentiert und gelingt daher auch Unix-NOOBS wie mir (wobei ich Unix seit den 80er Jahren kenne und eine noch ausgepackte Box mit Linux Suse 4.2 bei mir im Regal steht – das Interesse war also immer da;).

Dank snap gelingt die Installation inzwischen mit einem Aufruf – es muss kein Repo mehr registriert werden.

Der Aufruf sieht wie folgt aus:

sudo snap install powerShell --classic

Die Angabe „–classic“ ist aus für mich nicht mehr nachvollziehbaren Gründen offenbar erforderlich. Anschließend kann die PowerShell 7.0 (bzw. eine aktuellere Version) durch Eingabe von pwsh gestartet werden.

Auch bei der neuen PowerShell muss die Hilfe per Update-Help aktualisiert werden. Hier kommt es aber offenbar auf den Parameter -UICulture mit en-us als Parameterwert an. Anschließend zeigt die Hilfe dann auch die Beispiele an und alles sieht richtig gut aus. Auch wenn ich natürlich etwas voreingenommen bin, bin ich mir sicher, dass die PowerShell eine Bereicherung im (gigantischen) Linux-Ökosystem ist.

PowerShell 7-0 und SSH

PowerShell Remoting per SSH ist seit der ersten Version der PowerShell Core möglich und damit nichts Neues mehr. Wirklich gebraucht habe ich es bislang aber noch nicht. Der Newsletter von PowerShell-Experte Adam Betram („Adam the Automator“) hat mich dazu veranlasst, es nach langer Zeit wieder einmal selber auszuprobieren:

https://adamtheautomator.com/ssh-with-powershell/

Das ganze Thema ist sehr gut dokumentiert. Voraussetzung auf der Server-Seite ist natürlich SSH. Bei Linux und MacOS ist SSH fest eingebaut (ich gehe einmal davon aus, dass dies für jede Linux-Distribution gilt), bei Windows 10/Windows Server muss es in Gestalt von Open SSH for Windows eventuell nachträglich hinzugefügt werden:

https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_server_configuration

Der SSH-Server läuft als Systemdienst mit dem Namen „Sshd“, so dass sich sein Status per Get-Service einfach abfragen lässt. Durch die Installation des SSH Servers wird automatisch eine Firewall-Regel für den Port 22 angelegt.

Der SSH-Client ist im Folgenden eine PowerShell 7.0, die unter Ubuntu 16.04 läuft. Hier muss nichts konfiguriert werden.

Damit eine Verbindung mit dem SSH-Server möglich ist, muss auf dem Computer ein Eintrag zur Konfigurationsdatei sshd_config (ohne Erweiterung) im Verzeichnis C:\ProgramData\ssh hinzugefügt werden.

In einer als Administrator gestarten PowerShell wird die Datei wie folgt geöffnet:

Der Eintrag wird unterhalb von „override default of no subsystems“ eingefügt:

Abb. 1: PowerShell wird als Subsystem zum SSH Server hinzugefügt

Mehr ist nicht zu tun. Jetzt kann von einem Remote-Computer per PowerShell eine Remote-Verbindung per SSH hergestellt werden:

Der Parameter SSHTransport sorgt dafür, dass anstelle von WsMan SSH verwendet wird. „minipc“ ist in diesem Beispiel der Name des Windows-PCs mit SSH Server. Auch eine SSH-Session wird per exit verlassen.

Insgesamt ist es erfreulich, wie einfach sich eine PowerShell-Remoting-Session per SSH anlegen lässt.

Neues zur PowerShell – In Zukunft nur noch „PowerShell“

Auf der letzten Ignite-Konferenz von Microsoft (2019) gab es natürlich wieder einen „PowerShell Unplugged“-Vortrag von PowerShell-Erfinder Jeffrey Snover zusammen mit Jason Helmick, der inzwischen als Program Manager im PowerShell -Team arbeitet.

Das Anschauen lohnt sich wie immer, ein paar Details schon einmal vorab:

>Die nächste Version der PowerShell heißt nur noch „PowerShell“. Die Bezeichnung „PowerShell Core“ gibt es damit nicht mehr. Mit PowerShell 7 wird es eine PowerShell für alle Plattformen geben. Die vielen vertraute „Windows PowerShell“ wird es aber immer als Teil von Windows geben, auch wenn sie nicht mehr weiterentwickelt werden wird.

>Es ist bemerkenswert, wie nahtlos sich die PowerShell inzwischen in das Linux- und Mac OS-Ökosystem einfügt. Bei Kali Linux ist sie inzwischen Teil der Distribution, bei Mac OS kann die Preview über den AppStore installiert werden. Nett ist z.B auch, dass ein dir unter Linux die Ausgabe so aufbereitet wie es Bash-Nutzer gewohnt sind,

>Es gibt Verbesserungen, die auch langfähigen Nutzern gefallen wird. Kompaktere Fehlermeldungen, ein Get-Error-Command für das Abrufen der letzten Fehlerinformation, ein „Break on Error“, so dass ein Skript bei Auftreten eines Fehlers automatisch in den Debug-Modus übergeht und einiges mehr.

>Technisch ist die Parallelausführung von Commands natürlich ein echtes Highlight. Ob man beim Einrichten mehrerer VMs (wie oft kommt das vor?) jetzt aber vielleicht 3 Minuten statt 7 Minuten warten muss, sehe ich nicht als echte Verbesserung an. Aber generell hat das Features natürlich Potential.

Toll ist auch das neue Terminal-Programm, das als kleines Gimmick auch ein animiertes Gif anzeigen kann.

PowerShell 7 soll, wenn alles gut geht, im Januar 2020 offiziell wird.

Neben dem „Klassiker“ gab es auf der Ignite 2019 noch eine Reihe weiterer interessanter Sessions, die für PowerShell-User interessant sind: Eine Q&A mit Joe Aiello aus dem PowerShell-Team zu PowerShell 7, eine sehr interessante Session zum Zusammenspiel mit Microsoft Graph (es gibt ein neues PowerShell-Modul , aktuell noch als Preview, durch das einiges einfacher werden wird) und eine sehr gute Session von Martina Grom und Toni Pohl zu Office 365 Groups und PowerShell). Eine Suche im Ignite-Session-Katalog lohnt sich definitiv.

PowerShell Core auf Windows 7 – nicht ganz so einfach wie es sein könnte

Der Spruch „PowerShell on every system“ entspricht zwar der Realität, unter Windows 7 SP1 64 Bit ist es allerdings nicht ganz so einfach wie es sein könnte PowerShell Core 6.1.x zu installieren. Mit der Installation des Msi-Pakets alleine ist es in der Regel nicht getan.

Als erstes besteht eine Abhängigkeit zu WMF 4.0, die es eigentlich nicht geben sollte. Unter Linux kann sie auch nicht bestehen. Der Grund dürfte die neuerdings eingebaute „Windows-Kompabibilität“ sein, die Anwendern unter Windows auch mit PowerShell Core z.B. den Zugriff auf die Registry, den Umgang mit Freigaben oder ein Stop-Computer erlaubt. Aber nur unter Windows.

Also, zuerst WMF 5.1 und davor gegebenenfalls .NET Framework 4.7.2 oder eine aktuellere Version installieren (theoretisch tut es auch .NET Framework 4.5.2).

Die nächste Abhängigkeit besteht in der Installation der Universal C Runtime. Sie wird über ein Update installiert:

https://support.microsoft.com/de-de/help/2999226/update-for-universal-c-runtime-in-windows

Danach lässt sich PowerShell Core 6.1.2 zwar über das Msi-Paket installieren, aber leider noch nicht starten. Oder genauer, die Anwendung pwsh.exe startet, bricht aber gleich wieder mit einer Fehlermeldung ab, da eine Dll-Datei nicht vorhanden ist.

Da sich das Fenster in Sekundenbruchteilen wieder schließt, muss man einen kleinen „Trick“ anwenden und pwsh.exe in der Windows PowerShell per Start-Process starten und die Fehlermeldungen in eine Datei umleiten:

Es stellt sich heraus, dass die Datei hostfxr.dll nicht auf dem aktuellen Stand ist.

Um es kurz zu machen, durch die Installation des Windows 7-Updates KB2533623 wird auch dieses kleine Problem gelöst. Achtet aber darauf, dass es die 64-Bit-Version des Updates für ein 64 Bit-Windows 7 bzw. die entsprechende 32-Bit-Version ist.

Nach dem das Update installiert wurde, ist ein Neustart erforderlich. Danach lässt sich PowerShell Core auch unter Windows 7 starten.

Für mich widerspricht diese Abhängigkeit (unter Windows) zu WMF 4.0, einer Universal Runtime-Dll und einem Update ein wenig der ursprünglich einmal kommunizierten Aussage, dass PowerShell Core einfach eine portable Anwendung ist, die wie jede andere portable Anwendung lediglich über die Anwendungsdatei gestartet werden muss. Unter Linux gibt es diese Abhängigkeiten natürlich nicht.

Und da wir gerade dabei sind. Wer braucht wirklich den mit der Version 6.1 eingeführten „Kompatibilitätsmodus“ für Windows, durch den sich auch die meisten der bei Windows Server mitgelieferten Module auch in einer PowerShell Core-Session laden lassen? Es ist offenbar für einen Großkonzern doch nicht ganz so einfach neue Wege zu gehen.

PowerShell unter Linux installieren

Der folgende Beitrag ist eher eine „Note to my self“, damit ich beim nächsten Mal danach nicht suchen muss – auf der PowerShell Projektportalseite ist alles sehr schön und vollkommen ausreichend beschrieben:

https://docs.microsoft.com/de-de/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-6#ubuntu-1604

Aber vielleicht doch etwas zu ausführlich.

Also, mit der Linux-VM per SSH verbinden. Danach geht es wie folgt weiter:

Schritt 1: Herunterladen der Schlüssel (keys), damit das Microsoft-Repo vom Paketmanager als vertrauenswürdig behandelt wird.

Schritt 2: Registrieren der Microsoft-Schlüssel

Schritt 3: Aktualisieren aller Pakete

Schritt 4: Jetzt wird das PowerShell-Paket installiert

Es wird automatisch die aktuellste stabile Version installiert.

Schritt 5: Ging alles gut, PowerShell starten

Ein $PSVersionTable gibt aus, um welche Version es sich tatsächlich handelt. 6.2, 6.3 womöglich sogar 6.4:)

Wurde die Microsoft-Paketquelle registriert, lässt führt ein allgemeines Upgrade aller Pakete auch dazu, dass PowerShell aktualisiert wird.

Möchte man lediglich PowerShell auf den aktuellesten Stand bringen, muss install erneut ausgeführt werden.

Update 18/02/19:

Bei aktuellen Ubuntu-Versionen kann man sich dank dem von canonical entwickelten Package-Format snap alle der hier aufgezählten Schritte sparen. Einfach „pwsh“ eingeben und den Anweisungen folgen. Kurz danach kann PowerShell Core per „pwsh“ gestartet werden. Einfach und genial. Aber vermutlich bleibt der Komfort auf Ubuntu beschränkt.

Kleine Tipps für Zwischendurch: PowerShell Core-Module aus der PowerShell Gallery auflisten

PowerShell Core ist die Zukunft. Möglichst viele der Module, die Teil von Windows und Windows Server sind, sollen früher oder später auch für PowerShell Core verfügbar sein.

Modul-Autoren sollen im Modulmanifest den Eintrag CompatiblePSEditions verwenden und dort die Editionen „PSDesktop“ und „PSCore“ eintragen. Dieser Eintrag wird aber erst ab WMF 5.1 verstanden.

Aktuell ist es nicht ganz so einfach wie es sein könnte herauszufinden, ob ein Modul der PowerShell Gallery auch für PowerShell Core in Frage kommt. Diese Information verbirgt sich in der unscheinbaren Tags-Eigenschaft eines Modul.

In der PowerShell Dokumentation wird das Prinzip der Abfrage bereits ausführlich beschrieben:

https://docs.microsoft.com/en-us/powershell/gallery/how-to/finding-items/searching-by-psedition

Zwei kleine Beispiele sollen die Abfrage per Find-Module in der Praxis zeigen.

Etwas komfortabler ist der folgende Befehl, der zu allen Modulen der PowerShell Gallery die Editionen angibt, unter denen sie verwendet werden können.

Der folgende Befehl gruppiert die ganze Ausgabe nach der Eigenschaft Edition:

Wenn die Abfrage stimmt, sind von den über 3.200 Modulen der PowerShell Gallery nur etwas über 200 Module mit einem PSEdition-Information versehen. Und da man in die Tags-Eigenschaft alles eintragen kann, gibt es auch unterschiedliche Schreibweisen.

Wer bei den installierten Modulen die Edition abfragen möchte, verwendet dazu die CompatiblePSEditions-Eigenschaft:

oder

Wenn in der PowerShell-Konsole oder ISE nichts ausgegeben wird, liegt es an der PSModulePath-Umgebungsvariablen. Nur bei PowerShell Core ist das Verzeichnis c:\Program files\powershell\6\Modules mit dabei.

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!

Für alle Fälle die Downloadadresse für alle Versionen:

https://github.com/PowerShell/PowerShell/releases

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.

Die neue PowerShell 6.0 – jetzt sogar mit einer Art Maskottchen


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 oder Kleinigkeiten wie ein Get-LocalUser-Cmdlet) 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

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 ***