Archiv des Autors: PemoAdmin

PowerShell Module schreiben – mit ein paar Tools geht es leichter

Das Schreiben eines PowerShell Moduls ist grundsätzlich nicht schwer. Im einfachsten Fall speichert man lediglich eine Ps1-Datei mit ein paar Functions als Psm1-Datei in ein leeres Verzeichnis und fertig ist das Modul. Möchte man es richtig machen, steckt eine Menge Arbeit dahinter (ich muss es wissen, denn in meiner Freizeit arbeite ich seit ein paar Wochen an meinem Osmium-Modul, das es in ein paar Wochen auf GitHub bzw. in der PowerShell Gallery geben wird).

Welche Tools Modulautoren unterstützen können, hat PowerShell-Experte David Christian in einem Blog-Eintrag zusammengestellt:

https://overpoweredshell.com//Tools-Module-Authors-Should-Leverage/

Kleine Tipps für Zwischendurch: ForEach-Wiederholung mit Zählvariable

Ein kleiner Nachteil der praktischen ForEach-Methode von Arrays ist, dass es keine Zählvariable gibt. Mit dem ++-Operator spart man sich zumindestens einen weiteren Befehl, der die Variable inkrementiert.

Tipp: Oracle Datenbanken per PowerShell ansprechen

Wer Oracle hört, denkt wahrscheinlich zunächst an hochpreisige Produkte und komplizierte Installationen. Das ist natürlich nur bedingt der Fall.

In jedem Fall ist der Zugriff auf eine Oracle DB per PowerShell sehr einfach. Voraussetzung ist, dass ODP.NET (z.B. als Teil der Developer Tools for Visual Studio) installiert wurde. Die Developer Tools installiert man auch dann, wenn kein Visual Studio vorhanden ist. In jedem Fall gibt es danach eine Assembly mit dem Namen Oracle.ManagedDataAccess.dll in dem Verzeichnis, in das die Developer Tools installiert wurden.

Das folgende kleine Beispiel geht von einer vorhandenen Datenbank aus. Benutzername und Kennwort sind natürlich frei erfunden. Wichtig ist nur, dass der Pfad der Dll-Datei stimmt.

Für eine konkrete Datenbankabfrage muss lediglich ein OracleCommand-Objekt angelegt, der CommandText-Eigenschaft ein SQL-Kommando zugeordnet und per ExecuteReader() ein DataReader geholt werden, der dann per Read() durchlaufen wird. Sollte alles kein Problem sein.

PS: Ein Listener muss dazu nicht mehr konfiguriert werden. Die Oracle DB läuft ohnehin nicht auf dem Computer, auf dem die Abfrage ausgeführt wird.

Wenn das Laden einer Assembly per Add-Type mit der Fehlermeldung „Operation not supported“ fehlschlägt…

Das Laden einer Assembly in einem PowerShell-Skript ist im Grunde sehr einfach: Per Add-Type und dem Path-Parameter.

Vor kurzem hatte ich einen Fall, bei dem sich eine Assembly (Npgsql.dll für den Zugriff auf PostgreSQL-Datenbanken) einfach nicht laden lies. Es war frustrierend, da mir wieder einmal klar wurde wieviel (Lebens-)zeit ich schon mit solchem Sch… verbracht hatte (sorry;).

Am Ende war die Lösung so trivial, dass ich einen Tritt in den Hintern verdient gehabt hätte. Ich hatte vergessen, die Datei zu „entsperren“ also den Zone.Identifier-ADS aus der Datei zu entfernen.

Nach einem Neustart der ISE lies sie sich problemlos laden. Ich hätte vielleicht auch eher nach dem Fehlercode 0x80131515 googlen sollen. Dann wäre ich auf einen StackOverflow-Beitrag gestoßen, der alles erklärt:

https://stackoverflow.com/questions/13799260/powershell-runtime-exception-could-not-load-file-or-assembly

„Suchet und ihr werdet finden“ (Matthäus 7,7)

Kleine Tipps für Zwischendurch: Hex-Zahlen als Dezimalzahlen ausgeben

Das Umwandeln eines Hex-Wertes in einen Dezimalwert ist wirklich sehr einfach:

„Hex“ ist aber keine „magische Zutat“, sondern die wie immer sehr praktische Eigenschaft der PowerShell, das die Felder einer Konstantenliste nicht nur nicht vollständig qualifiziert werden müssen, sondern auch abgekürzt werden können. Offiziell wäre der Name System.Globalization.NumberStyles.HexNumber.

Kleine Tipps für Zwischendurch: Textabfragen mit Sls (Select-String)

Der Umstand, dass bei der PowerShell alles auf Objekten basiert, bietet nicht nur Vorteile. Ein Ausnahme von der Regel ist das Durchsuchen der History.

Wer

eintippt erwartet, dass alle Befehlszeilen ausgeben, die das Wort „startapp“ enthalten. Dem ist aber nicht so, da für das gewünschte Resultat explizit die CommandLine-Eigenschaft abgefragt werden müsste.

Auch ein

bringt nicht. Wer es mit ? alias Where-Object

eingeben. Das ist für das mal eben-Abfragen der History natürlich keine Option. Zum Glück gibt es mit Select-String und seinem Alias sls eine einfache Alternative:

Dieser Befehl durchsucht den Output von Get-History unabhängig von den Namen einzelner Eigenschaften nach dem Wort „startapp“.

Dass bei dieser Abfrage MatchInfo-Objekte resultieren, was eventuell eine Weiterverarbeitung etwas erschweren könnte, wollen wir großzügig übersehen.

DSC Pullserver mit SQL Server als Datenbank

Ein DSC Pullserver verwendet standardmäßig eine ESENT DB-Datenbank (das „ESE“ steht für Extensible Storage Engine) für das Abspeichern der Konfigurationszustände der einzelnen Nodes. Bei der Umsetzung von DSC wollten es die Entwickler offenbar einfach halten und haben auf eine bewährte Datenbankengine gesetzt, die u.a. von Active Directory und Exchange Server verwendet wird, und die seit Windows XP einfach da ist. Für die Praxis ist eine SQL Server-Datenbank die bessere Option. In erster Linie weil sich dadurch Reporting-Möglichkeiten ergeben, die ansonsten nicht oder nur eingeschränkt zur Verfügung stehen.

Tipp: Ein praktisches kleines Tool für das Betrachten von ESENT DB-Datenbanken ist die ESENT Workbench: https://bitbucket.org/orthoprog/esentworkbench/wiki/Home.

Tipp<: Auf GitHub gibt es einen Managed Essent DB-Provider. Mit seiner Hilfe soll der Zugriff auf eine Datenbank in Managed Code und damit auch per PowerShell sehr einfach einfach: https://github.com/Microsoft/ManagedEsent.

Leider lässt sich eine SQL Server-Datenbank in der aktuellen DSC-Version (Stand: Mai 2018) noch nicht einbinden. Der Grund ist eher trivial. DSC verwendet für den Zugriff auf die ESENT DB-Datenbank benannte Parameter, der für den SQL Server-Zugriff zu verwendende Datenbankprovider versteht diese offenbar nicht und erwartet, dass jeder Parameter durch ein ? repräsentiert wird. Das kann wiederum nur die Jet-Engine von Microsoft Access. Deswegen muss eine Access-Datenbank in Gestalt einer Mdb-Datenbankdatei, die lediglich verknüpfte Tabellen auf die SQL Server-Datenbank enthält, als Vermittler eingeschaltet werden.

Microsoft-Mitarbeiter und PowerShell-Experte Raimund Andrée beschreibt die Hintergründe in einem Blog vom Mai 2017 sehr ausführlich, so dass ich auf seinen Blog verweise, da der alle Fragen beantworten sollte:

https://blogs.technet.microsoft.com/fieldcoding/2017/05/11/using-sql-server-2016-for-a-dsc-pull-server/

Die Vorgehensweise ist, die ESENT-Datenbank Devices.edb durch eine per Microsoft Access erstellte Datenbank mit dem Namen Devices.mdb auszutauschen, deren Tabellen auf die gleichnamigen Tabellen der SQL Server-Datenbank verlinken. Klingt vielleicht umständlich, ist in der Umsetzung aber relativ einfach. Ob es tatsächlich funktioniert ist aber noch ein anderes Thema (Stand 31/05/18 ist es mir nicht gelungen, einen Pull Server mit SQL Server-Datenbanb zu betreiben – die Gründen haber nur indirekt etwas mit DSC zu tun, sondern eher mit der TLS/SSL-Problematik).

Mit Windows Server 2019 soll das Einbeziehen einer SQL Server-Datenbank dann direkt möglich sein:

https://blogs.msdn.microsoft.com/powershell/2018/04/19/windows-pull-server-planning-update-april-2018/
Ob es dieses Update auch für ältere Windows Server-Versionen geben wird ist nicht klar (meine Frage diesbezüglich wurde noch nicht beantwortet)

Ergänzungen aus der Praxis

Das Anlegen einer ODBC-Datenquelle ist aus verschiedenen Gründen nicht ganz so einfach wie es sich in de Anleitung anhört.

>SSL 3.0 kann ein Thema sein. Sollte das Herstellen einer Verbindung hartnäckig an einem Error 18 scheitern, kann das Aktivieren von SSL 3.0 die Lösung sein. Eine praktisches kleines Tool ist IISCrypto.exe (Download unter https://www.nartac.com/Products/IISCrypto/), mit dem sich TLS und SSL sehr einfach aktivieren oder deaktivieren lassen (anschließend ist ein Neustart erforderlich).

Eine Alternative ist der Weg über die lokalen Sicherheitsrichtlinien bzw. Gruppenrichtlinien:

https://dba.stackexchange.com/questions/93127/sql-server-service-won-t-start-after-disabling-tls-1-0-and-ssl-3-0

Man braucht wieder einmal viel Zeit und vor allem Geduld und sehr viel Nachsicht den verantwortlichen DSC-Entwicklern gegenüber.

Kleine Tipps für Zwischendurch: C#-Code testen

Wer lediglich ein paar Zeilen C#-Code testen möchte, muss dafür nicht Visual Studio starten, um dort ein Projekt anlegen zu müssen, wenngleich dies natürlich kein allzu großer Aufwand ist und es mit Visual Studio Code einen Editor gibt, der vielsprachig ist. Es geht auch per PowerShell und dem vielseitigen Add-Type-Cmdlet. Über den MemberDefinition-Parameter wird der C#-Code für eine Membermethode übergeben. Name der Klasse und eventuell auch ein Namespace werden per Parameter festgelegt.

Das folgende Beispiel veranschauhlicht die einfache Vorgehensweise. Eventuell wäre eine statische Methode noch etwas kürzer.

Es gibt sie auch – kommerzielle Tools für die PowerShell

Es gibt nicht viele kommerzielle Tools für die PowerShell, das Angebot ist mehr als überschaubar. Mehr oder weniger spontan fallen mir folgende Produkte ein:

  1. PowerShell Studio von Sapien Technologies
  2. PowerShell Server und die NetCmdlets von n/Software
  3. ScriptRunner von AppSphere
  4. ISE Steroids natürlich von Tobias Weltner
  5. BlueParq von BlueParq BV aus den Niederlande (die Jungs haben diesen Sommer viel Zeit zum Skripten)

Auf BlueParq bin ich erst vor kurzem in einem Artikel in IT-Administrator aufmerksam geworden. Es klingt sehr interessant und ich werde das Tool in Kürze (sprich in den nächsten 3-6 Monaten;) in meinem Blog vorstellen.

Auf zwei weitere kommerzielle Tools bin ich eher per Zufall aufmerksam geworden.

  1. PowerShell Pro Tools
  2. PowerShell Universal Dashboard

Beide Tools stammen von IronMan Software. Insbesondere das Universal Dashboard macht einen sehr interessanten Eindruck, da ich mit seiner Hilfe beliebige „Informationscockpits“ á la Nagios zusammenbauen lassen. Eine naheliegende Anwendung ist es, Daten aus dem Office 365-Portal, etwa Nutzerstatistiken (sofern solche dank DSGVO überhaupt noch erfasst werden dürfen), darzustellen.

Beide Tools werde ich in den nächsten Wochen (hoffentlich werden es keine Monate) an dieser Stelle vorstellen. Wer solange nicht warten möchte, probiert sie am besten selber aus.