Archiv der Kategorie: Tipps

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.

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.

Kleine Tipps für Zwischendurch: Regexe mit Umlauten und anderen Zeichen und die Fehlermeldung „[x-y]-Bereich in umgekehrter Reihenfolge“

Regexe praktisch und alles andere als kompliziert, wenn man sich auf einfache Anwendungsfälle beschränkt. Etwa, das Zerlegen von Zeilen, die aus einem Tag in spitzen Klammern und einem Rest bestehen. Zum Beispiel:

Der Regex soll „slide“ und den Text liefern, der auf die schließende spitze Klammer folgt. Grundsätzlich kein allzu großes Problem, allerdings liefert der folgende Regex die Fehlermeldung [x-y]-Bereich in umgekehrter Reihenfolge:

Die Erklärung ist ebenfalls ganz einfach (vor allem, wenn man es weiß;). Da ich neben vielen Sonderzeichen auch den Bindestrich prüfe, kommt dieser in der Gruppe ebenfalls vor. Er muss dabei aber am Anfang der Gruppe stehen, da er ansonsten als Metazeichen interpretiert wird. Ich hatte ja erwähnt, dass die Fehlermeldung eine ganz einfache Ursache hat.

Der richtige Regex ist daher:

PoshConf Europe 2018 – es gibt noch freie Plätze und wer speakt wie oft und über was

In knapp 3 Wochen startet in Hannover die PowerShell Conference Europe 2018 – vom 17. bis 20. April. Aktuell gibt es noch freie Plätze. Wer sich immer schon einmal mit dem Erfinder der PowerShell Jeffrey Snover oder dem „Brain“ hinter der PowerShell-Sprache Bruce Payette unterhalten möchte (oder falls vom Gespräch auf der letzten Konferenz noch Fragen offen geblieben sind) hat dazu die Gelegenheit. Alle Infos unter http://www.psconf.eu/.

Ich werde dieses Mal nicht dabei sein, aber mich interessiert natürlich trotzdem wer welche Vorträge hält.

Unter http://powershell.beer steht die gesamte Agenda im JSON-Format zur Verfügung.

Der folgende Befehl gibt sie übersichtlich aus:

(Das $ sollte eigentlich nicht erforderlich sein)

Mich interesiert natürlich welche Sprecher die meisten Vorträge halten und natürlich auch welche das sind. Das kleine „Problem“ ist, dass es bei einigen Vorträgen mehrere Sprecher gibt und die Speaker-Eigenschaft daher auch mehrere Namen enthält.

Der folgende Befehl gibt die Sprecher gruppiert nach ihrem Namen und sortiert nach der Anzahl ihrer Vorträge aus.

Das Problem mit dieser Ausgabe ist nur, dass die Sprecher nicht einzeln aufgelistet werden, da es zu einem Vortrag auch mehrere Sprecher geben kann. Die Speaker-Eigenschaft enthält dann mehrere (zwei oder drei) per Komma getrennte Namen.

Wer das Problem selber lösen möchte, sollte jetzt nicht weiterlesen, sondern sich ca. 1 Stunde Zeit nehmen. Es hat mich nicht ganz so viel Zeit gekostet, aber es war schon ein wenig Hin- und Herprobieren erforderlich bis endlich das gewünschte Ergebnis herauskam.

Der Knackpunkt an der Geschichte war, dass ich zuerst auf Invoke-WebRequest umschalten musste, um den JSON-Text direkt zu erhalten (eventuell ist das auch nicht erforderlich) und dann darauf kommen musste, dass die Rückgabe aus einem einzelnen Objekt-Array besteht und nicht aus vielen Objekten – was die Ausgabe suggeriert (darauf bin ich in den letzten Jahren schon einige Male hereingefallen;) – der entscheidende Test ist für mich immer. ob Measure-Object ein Objekt zurückgibt oder mehrere. Ausgehend von einem einzigen Objekt habe ich dessen Content-Eigenschaft expandiert und aus dem resultierenden JSON-Text Objekte gemacht, die per ForEach durchlaufen werden. Da sich hinter der Speaker-Eigenschaft mehrere Namen verbergen können, werden diese per -split-Operator alle einzeln fein säuberlich getrennt und mit der zuvor gespeicherten Title-Eigenschaft zu einem neuen Objekt kombiniert. Dieses besitzt erneut eine Speaker-Eigenschaft mit dem Namen eines Speakers, nach der gruppiert werden kann.

Alles klar? Egal, hier ist ein möglicher Versuch:

Wer ist der Top-Speaker auf der PowerShell Conference Europe 2018?

Netzwerktools und ihre PowerShell-Pendants

Beim Vorbereiten auf einen MOC-Kurs zu Windows 10 ging es auch um die Netzwerkkonfiguration. Es ist erfreulich, dass in den aktuelleren MOC-Unterlagen auch die PowerShell inzwischen erwähnt wird und Gegenstand einiger Demos und Labs ist.

Da auch für mich als PowerShell-Kenner nicht immer auf Anhieb einfällt was z.B. das Pendant zu Nslookup oder ipconfig /flushdns ist, bin ich froh den folgenden Blog-Eintrag gefunden zu haben, in dem der Autor die klassischen Netzwerkkommandos den PowerShell-Befehlen gegenüberstellt:

https://blogs.technet.microsoft.com/josebda/2015/04/18/windows-powershell-equivalents-for-common-networking-commands-ipconfig-ping-nslookup/

Ein wenig kurios ist allerdings, dass dem Autor nicht klar war, dass PowerShell 5.0 zu verwenden nicht automatisch bedeutet, dass Befehle wie Get-NetIPAddress zur Verfügung stehen, da diese Teil des Betriebssystems und nicht der PowerShell sind. Das Ergebnis waren daher auch ein paar „bei mir läuft es nicht, obwohl ich Version 5.0 verwende“-Kommentare.

Was ich noch suche ist ein Pendant zu dem sehr praktischen Portqry.exe, das aber zuerst von einer Microsoft-Seite heruntergeladen werden muss.

Kleine Tipps für Zwischendurch: Alle Dienstnamen pro Svchost-Prozess ausgeben

Vor kurzem habe ich in einem Blog-Eintrag eine PowerShell-Befehlsfolge gefunden, die zu jedem Svchost-Prozess die Namen der Dienste ausgibt, die von diesem Prozess ausgeführt werden. Die Lösung war gut, aber leider sehr umständlich. Vermutlich war der Autor Entwickler und hat ein wenig zu sehr die Entwicklerdenkweise bei der Umsetzung der eigentlich einfachen Aufgabenstellung angewendet. Bei mir hat es auch ein paar Jahre gedauert bis ich mir diese Denkweise bei der PowerShell abgewöhnt hatte.

Mein Vorschlag für eine Unmsetzung sieht wie folgt aus.

Es kann lediglich eine Weile dauern bis eine Ausgabe erscheint.