Archiv für den Monat: August 2016

PowerShell Monday – eine rundum gelunges Usergroup-Treffen, das hoffentlich wiederholt wird

Der erste PowerShell Monday (nach Angaben des Co-Organisators Christian Lehrer sogar der erste weltweit), der am 22.8.2016 in München stattfand, war eine überaus gelungene Veranstaltung. Auch wenn Mathias Jessen leider nicht kommen konnte, da er seinen Flug offenbar verpasst hatte und der Ersatzflug gestrichen wurde, gab es zu keiner Minute einen Leerlauf. Die Agenda war sehr gut zusammengestellt von erstem Vortrag zum Thema Pester von Andreas Platt bis zum letzten Vortrag des Abends mit Scripting Guy Ed Wilson, der mit seiner Frau Theresa wieder einmal auf „Europa-Tournee“ ist. Die anfänglichen Beamer-Probleme gehören einfach dazu und kommen laut Jeff Wouters auch auf einer TechEd vor.

Organisiert wurde der PowerShell Monday von der PowerShell User Group Südwest. Die Veranstaltung fand in München in den Räumen der Firma Acentrix statt, die freundlicherweise nicht nur die Räume zur Verfügung stellte, sondern auch die Getränke und am frühen Abend mehrere Wagenrad großen Pizzen sponsorte. Mit über 30 Teilnehmern (es können auch ein paar mehr gewesen sein) war die Veranstaltung sehr gut besucht.

Der thematische Höhepunkt war der Vortrag von Ed Wilson, der seit November letzten Jahres nicht mehr im PowerShell-Team, sondern in der noch relativ jungen Produktgruppe Microsoft Operation Management Suite (OMS) arbeitet. In seinem Vortrag stellte er das erst im letzten Jahr auf der Ignite-Konfeenz vorgestellte Produkt ausführlich vor. OMS ermöglicht die Server-Administration im Rahmen des Azure-Portals und stellt damit eine Alternative zum System Center Configuration Manager dar, der in der kommenden Version 2016 noch „clound-freundlicher“ werden soll.

Die wichtigste Aussage ist, dass OMS für bis zu 5 Server kostenlos ist und dies auch uneingeschränkt bleiben soll. Weitere Infos gibt es unter der leicht zu merkenden URL

http://www.microsoft.com/oms

Die von Amanda Debler (Office 365 und Skype for Business) aufgezeichneten Videos soll es in ca. 2 Wochen auf YouTube geben. Ed Wilson will seine Folien zum Thema OMS nach Abschluss seiner Konferenzreise zur Verfügung stellen.

Ein kleines Highlight war eine Skype-Videokonferenz mit PowerShell-Erfinder Jeffrey Snover, der noch einmal auf die Gründe einging aus der PowerShell ein Open Source-Projekt zu machen und erwähnte nebenbei, dass die nächste Version SSH als Alternative zu WsMan für PowerShell Remoting verwenden wird. Ein nettes Detail am Rande war, dass er sich auf einer Linux-Konferenz befand, um die PowerShell for Linux vorzustellen, und aus Rücksichtnahme auf die Konferenzteilnehmer auf seine traditionelle bunte Krawatte verzichtete (für Heiterkeit sorgte seine Anmerkung, dass die Leute etwas anders sind als er es von Microsoft-Konferenzen gewohnt ist, und dass er auf der Konferenz einen Typ gesehen hatte, der nur einen grünen Umhang (Toga) trug).

Für mich persönlich war es sehr schön endlich Ed Wilson in Deutschland zu treffen – er war schon öfter bei PowerShell UserGroup-Treffen anwesend, aber ich war aus den verschiedensten Gründen nie dabei. Ed ist ein sehr humvorvoller Mensch, der eine enorme Freude an seiner Arbeit hat und sehr viel Erfahrung in den unterschiedlichsten Gebieten hat, die etwas mit Windows-Administration und Scripting zu tun haben. Wer seine „Hey, Scripting Guy“-Kolummne kennt, wird dies sicher bestätigen.

Alle Infos zum PowerShell Monday gibt es unter der folgenden Adresse: http://www.psmonday.eu/

PowerShell unter Ubuntu – die ersten Schritte

Seit dem 18. August 2016 heißt die Windows PowerShell ganz einfach nur noch „PowerShell“ und steht als Open Source-Projekt nicht nur für Windows, sondern auch für verschiedene Linux-Distributionen und Mac OS X zur Verfügung (allerdings nicht für iOS, so dass die PowerShell z.B. nicht auf einem iPad installiert werden kann – jedenfalls solange nicht wie sich jemand die Mühe macht .NET Core für iOS zu portieren).

Dabei kommt es wie üblich auf die Feinheiten an. Open Source und damit portabel ist nicht die aktuelle PowerShell 5.0 wie wir sie kennen, die mit der kommenden Version 5.1 offiziell „Desktop Edition heißen wird, sondern eine frühe Alpha-Version einer kommenden Version 6.0. Das bedeutet konkret, dass viele wichtige Funktionen, etwa Cmdlets für WMI- und AD-Abfragen, aktuell noch nicht zur Verfügung stehen. Sie werden kommen, aber das kann noch eine Zeit dauern. Mit anderen Worten, allzu viel anfangen kann man mit der am 18.8 freigegebenen Version im Moment noch nicht.

Dennoch ist alleine der Umstand, dass die PowerShell endlich auch unter Linux läuft faszinierend genug, um es einfach einmal ausprobieren.

Die folgenden Schritte beziehen sich auf Ubuntu 16.04 Desktop:

Schritt 1: Herunterladen der Deb-Datei

Die Downloadadresse für die 0.9 Alpha für Ubuntu 16.04 ist:

https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.9/powershell_6.0.0-alpha.9-1ubuntu1.16.04.1_amd64.deb

Schritt 2: Installieren
Was macht man mit einer Deb-Datei unter Linux? Zumindestens unter Ubuntu funktioniert der Doppelklick. Das Paket wird damit installiert, was in diesem Fall lediglich bedeutet, dass sein Inhalt in ein eigenes Verzeichnis kopiert und im Verzeichnis usr\bin eine Art Verknüpfung auf die Powershell-Programmdatei angelegt wird.

Die Suche nach dem Begriff "PowershelL" war erfolgreich

Die Suche nach dem Begriff „PowershelL“ war erfolgreich

Schritt 3: PowerShell starten
Wie startet man eine Anwendung unter Ubuntu, wenn man nur Windows kennt? Gute Frage. Ich habe mir so beholfen, dass ich zuerst das Terminal-Programm gestartet habe, dahinter steckt die Bash-Shell, dann auf vertraute Weise per cd in das Verzeichnis \usr\bin navigierte und dann die PowerShell durch Eingabe von „.\powershell“ startete. Die PowerShell startet nicht in einem eigenen Fenster, sondern läuft im aktuellen Terminalfenster.

Unter Ubuntu belegen die meisten Prozesse nur ein paar KB statt über 100MB

Unter Ubuntu belegen die meisten Prozesse nur ein paar KB statt über 100MB

Interessant ist, dass mein „Lieblingsbefehl“ Get-Process | Where WS -gt 50MB keine Ausgabe zur Folge hatte. Wie sich herausstellte, gibt es bei Ubuntu kaum einen Prozess, der mehr als 100KB (!) belegt.

PowerShell unter Ubuntu

PowerShell unter Ubuntu

Wie erwartet funktioniert einiges nicht, z.B. WMI-Abfragen über Get-CIMInstance.

Das Ganze war eher eine Art Schnelldurchlauf. Eine schönere Anleitung gibt es von Sebastian Klenk, technischer Evangelist bei Microsoft – er beschreibt in einem Blog-Eintrag wie sich die PowerShell in einer Ubuntu-VM unter Azure installieren lässt, in dem er sich von seinem Windows 10-PC unter dem neuen Ubuntu Subsystem per SSH mit dem Azure Ubuntu verbindet und über diese Verbindung die PowerShell installiert:

https://blogs.technet.microsoft.com/sebastianklenk/2016/08/19/how-to-powershell-on-linux/

Coole Sache! (aber nicht vergessen: Auch eine Ubuntu-VM kostet bei Azure Geld – Open Source hin oder her;)

PowerShell unter Mac OS X – der Weg ist das Ziel

Warum um alles in der Welt sollte man die PowerShell auf einem Apfel-Computer benötigen? Ein 100% überzeugendes Argument fällt mir dazu zwar nicht ein, aber wenn es diese Option seit kurzem gibt, sollte man sie auch einmal ausprobieren.

Schritt 1:
Der erste Schritt besteht in dem Download der Paketdatei, die das PowerShell-Team im Rahmen des GitHub-Portals auf der Release-Page für die aktuelle Alpha-Version zur Verfügung stellt:

https://github.com/PowerShell/PowerShell/releases/tag/v6.0.0-alpha.9

Schritt 2:
Anklicken der Pkg-Datei mit der rechten Maustaste (die gedrückte Ctrl-Taste ist offenbar nicht erforderlich) und Auswahl von Öffnen. Anschließend das Paket installieren.

Als absoluter Mac-Dummy-User habe ich nach der Standardinstallation das Verzeichnis nicht finden können, unter dem die Dateien abgelegt wurden. Unter „Programme“ wird die PowerShell offenbar nicht angezeigt. Erst als ich das Paket auf eine leere Festplatte „installieren“ ließ, habe ich das Verzeichnis usr/local/microsoft/powershell/6.0.0-alpha.9 mit der Powershell.exe entdeckt;)

Schritt 3:
Ein Doppelkick auf Powershell.exe startet das gute Stück. Bei den ersten Gehversuchen wird schnell deutlich, dass natürlich nicht die gewohnte Funktionalität im vollem Umfang zur Verfügung stehen kann. Was z.B. noch nicht implementiert wurde ist WMI auf der Basis von CIM. Trotzdem ist es beeindruckend, dass ein „Get-Process | WS -gt 50MB“ nun auch unter Mac OS X funktioniert. Auch wenn es im Moment noch keine zwingenden Anwendungsfälle gibt, eine Bereicherung ist die PowerShell in dieser Umgebung, in der bislang das Terminal-Fenster mit der Bash-Shell die einzige (vorinstallierte) Option war, in jedem Fall.

Eine kleine "Sensation" - dank Open Source-PowrerShell gibt es die PowreShell-Konsole nun auch auf dem Mac

Eine kleine „Sensation“ – dank Open Source-PowrerShell gibt es die PowreShell-Konsole nun auch auf dem Mac

PowerShell ist Open Source!

Die PowerShell ist ab heute (18.8.2016) eine Open Source-Anwendung unter einer MIT-Lizenz. Eine allzu große Überraschung war die heutige Ankündigung allerdings nicht mehr, da das PowerShell-GitHub-Portal schon vor einigen Monaten online ging und durch die Verzeichnisstruktur klar war, dass hier nicht nur die Dokumentation (die inzwischen größtenteils auch in Deutsch verfügbar ist) abgelegt werden würde.

Trotzdem war es ein besonderer Moment für mich als ich heute die Mail mit der Benachrichtigung erhielt, dass der Vorschlag „PowerShell for Linux“ auf UserVoice mit 341 Stimmen angenommen wurde:

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11689284-powershell-core-for-linux?tracking_code=ef3c9635de7f3bd3006f28db48a0eac9

Ab heute steht eine erste Vorabversion (Alpha) einer Open Source-PowerShell 6.0 für Mac OS X, verschiedene Linux-Distributionen (u.a. Ubuntu und CentOS) und für Windows zur Verfügung. Die Quellen stehen im GitHub-Portal zur Verfügung:

https://github.com/PowerShell

In einem Channel 9-Video stellt PowerShell-Erfinder Jeffrey Snover die aus seiner Sicht wichtigste Neuerung seit der Ankündigung der Version 1.0 ausführlich vor:

https://channel9.msdn.com/Blogs/hybrid-it-management/PowerShell-on-Linux-and-Open-Source

Setup der Open Source-Version der PowerShell unter MIT-Lizenz

Setup der Open Source-Version der PowerShell unter MIT-Lizenz

Die Open Source-PowerShell in der frühen Vorabversion unter Windows 10

Die Open Source-PowerShell in der frühen Vorabversion unter Windows 10

PowerShell User Group-Treffen mit Scripting Guy Ed Wilson am 22.8.2016 in München

Ein sehr attraktives Programm hat die PowerShell User Group Südwest für das nächste Treffen unter dem Motto „PowerShell Monday“ am 22.8.2016 in München zusammengestellt. Neben Andreas Patt (Pester), Amanda Debler (Office 365 und Skype for Business), Mathias Jessen (JEA), Rob Sewell (Datenbanken) und PowerShell MVP Jeff Wouters (Nanoserver) wird Scripting Guy Ed Wilson zum Thema DSC und Operation Management Server (OMS) den Tag abrunden.

Das Treffen beginnt um 13 Uhr und findet in München bei folgender Adresse statt:

Acentrix GmbH
Ingolstädter Str. 20, 4. Stock,
80807 München

Weitere Infos und Details zur Anmeldung gibt es hier: http://www.psmonday.eu/

Tipp: Sperrige Parameterbindung beim Select-String-Cmdlet

Das Select-String-Cmdlet besitzt drei Parameter, die ihren Wert aus der Pipeline beziehen können: Path, LiteralPath und InputObject. Der Path-Parameter wird per PropertyName gebunden, so dass der folgende Befehl funktionieren sollte:

Der Befehl soll alle als Skriptmodul implementierten DSC-Ressourcendateien durchgehen und jene Zeilen ausgeben, in denen das Wort „class“ enthalten ist, dem kein Minuszeichen vorausgeht. Doch leider gibt der Befehl gar nichts aus.

Der Hintergrund ist, dass obwohl der Path-Parameter seinen Wert aus der Pipeline holen kann, der InputObject-Parameter sich diesen Wert holt, da er ByValue funktioniert und diese Bindungsvariante Vorrang hat. Die Pfade werden daher dem InputObject-Parameter übergeben und nicht dem Path-Parameter, so dass anstelle des Inhalts der jeweiligen Datei der Pfad der Datei durchsucht wird.

Die Lösung ist nicht kompliziert, aber auch nicht besonders elegant. Sie besteht darin, auf die Pipeline zu verzichten und die Pfade direkt der Path-Eigenschaft zu übergeben.

Auch wenn das Verhalten „by design“ ist, ganz optimal ist es aus meiner Sicht nicht. Für mich wäre es logischer, wenn zuerst geprüft wird, ob das Objekt in der Pipeline eine Eigenschaft besitzt, deren Name dem Namen eines bindungsfähigen Parameters entspricht und erst, wenn das nicht der Fall ist, versucht wird den Wert in der Pipeline dem dafür vorgesehenen Parameter zuzuordnen.

Tipp: Verschachtelte Klassen und private Klassen ansprechen

Der folgende Beitrag fällt in die Kategorie „Wenn man einmal zu viel Zeit hat..“, denn das Thema, um das es geht, hat mit der Alltagspraxis eines Administrators ungefähr soviel zu tun wie Siegmar Gabriel derzeit mit der Kanzlerkandidatur bei der nächsten Bundestagswahl (ok, eine politische Anspielung muss auch einmal sein;)

Der Ausgangspunkt ist ein harmloser Befehl, den jeder schon einmal eingetippt haben dürfte (vor allem, wenn er an einem meiner PowerShell-Schulungen teilgenommen hat):

Doch was genau ist PrivateData? Eine Eigenschaft vom Host-Objekt, soviel ist klar. Doch welcher Typ steckt dahinter?

Ein $Host.PrivateData.GetType().FullName liefert als Typ Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy.

Doch ein

iefert eine Fehlermeldung, diesen Typ gibt es offenbar nicht. Und was hat das + zu bedeuten? Das + steht für eine verschachtelte Klasse.

Doch auch den Typ [Microsoft.PowerShell.ConsoleHost] scheint es nicht zu geben.

Ein Blick in die zuständige Assembly mit ILSpy offfenbart, dass es sich um eine Klasse vom Typ „Sealed“ handelt, die dadurch von außen nicht zugänglich ist. Solche Typen müssen mit der GetType()-Methode angesprochen werden. Aber mit jener Varianten, die direkt über die Assembly zur Verfügung steht weil nur hier der Typenname als Argument übergeben werden kann:

Damit lässt sich der Typ abfragen:

Auch die „innere Klasse“ lässt sich auf einmal wie gewohnt ansprechen:

Damit wäre das „Geheimnis“ des +-Zeichens in einem Typenanmen gelöst. Es steht für eine Klasse, die innerhalb einer anderen Klasse definiert ist. Ist die äußere Klasse „sealed“, lässt sich der Typ nur über einen Umweg ansprechen. Praktisch ist damit nichts gewonnen, denn die Members der ConsoleColorProxy-Klasse lassen sich auch ohne diese „Verrenkungen“ direkt ansprechen. Der kleine Ausflug in die Welt der Typen sollte in erster Linie deutlich machen, warum Get-Member für die Eigenschaft PrivateData einen Typennamen liefert, den es scheinbar nicht gibt.

OpenLDAP-Server per PowerShell ansprechen

Einen (Open) LDAP-Server per PowerShell anzusprechen ist grundsätzlich natürlich kein Problem. Am einfachsten geht es mit einem Satz von Cmdlets, den die Firma n/Software (in der PowerShell-Community vor allem bekannt für ihren PowerShell-Server, der das Herstellen einer Remote-Verbindung zu einer PowerShell-Session per SSH ermöglicht) unter dem Namen NetCmdlets vertreibt. Für den privaten Einsatz sind die Cmdlets, die bereits in der Version 4 vorliegen, dankenswerter Weise nach wie vor kostenlos:

http://www.netcmdlets.com/

Wer ohne die Cmdlets auskommen möchte, muss lediglich ein DirectoryEntry-Objekt anlegen und mit den erforderlichen Daten versorgen.

Das folgende Beispiel führt eine Abfragen gegen den öffentlichen LDAP-Server ldap.forumsys.com durch.

Weitere Infos gibt es unter http://www.forumsys.com/en/tutorials/integration-how-to/ldap/online-ldap-test-server.

Mit Hilfe der erwähnten NetCmdlets von n/Software wird alles ein wenig kompakter und vor allem konsistenter. Ein weiterer kleiner Vorteil ist, dass „richtige“ Objekte zurückgegeben werden und kein Objekt mit einer Properties-Eigenschaft, das einen speziellen Typ von Collection darstellt (System.DirectoryServices.ResultPropertyCollection).

Das folgende Beispiel führt diesselbe Abfrage aus wie aus dem letzten Beispiel. Dieses Mal mit Hilfe der Cmdlets Connect-LDAP und Get-LDAP.