Und es geht doch (Remoting mit PsExec)

Zu jeder „Ära“ in der IT/EDV gab es diese Dinge, die eigentlich problemlos funktionieren sollten, die aber nur wenige Cracks beherrschten (Terminate and Stay Resident-Programme mit Turbo Pascal fallen mir spontan ein, doch das ist lange her – ca. 20 Jahre). Bei der PowerShell ist das natürlich Remoting. RPC-Aufrufe gibt es vermutlich solange wie es Windows (NT) gibt, doch mit der PowerShell von Rechner A auf Rechner B einen Prozess zu starten scheint eine Art „Geheimwissenschaft“ zu sein.

Klar, mit WMI und Win32_Process geht es natürlich (ich poste dazu in naher Zukunft auch ein Beispiel), doch besonders komfortabel ist diese Variante nicht, sofern sie nicht an fehlenden Berechtigungen scheitert.

Ebenfalls klar ist, dass mit Version 2 (V2) Remoting kommen wird, allerdings nicht auf der Basis von SSH, sondern auf der Basis von Webservice-Aufrufen gemäß der WS*-Spezifikation. Wenn es einmal läuft ist alles ganz easy, doch das Ganze zum Laufen zu bringen ist mir bislang noch nicht gelungen – meine paar „Mal eben schnell ausprobieren“-Versuche scheiterten an der Authentifzierung.

Eine nette Zwischenlösung bietet PsExec aus den SysInternal-Tools. Übrigens ein Pflicht-Download für jeden Windows-PowerUser. Punkt. Mit PsExec lässt sich grundsätzlich jeder Prozess auf einem Netzwerkcomputer starten, warum nicht auch PowerShell.exe, dem per C-Parameter ein Befehl oder der Pfad eines Skripts übergeben wird?

Um es kurz zu machen, es geht, aber erst wenn man einen Blog-Eintrag von Jeffrey Snower bzw. Lee Holmes gelesen hat. Darin wird der von Microsoft nicht dokumentierte PowerShell-Schalter EncodedCommand  beschrieben, der den kleinen, aber entscheidenden Unterschied zwischen Verzweiflung (warum funktioniert der Sch@!..!!$“>?@!..!!$ nicht) und euphorischen Glücksgefühlen (endlich!) ausmacht.

Hier ein kleines PowerShell-Skript (alle Angaben beziehen sich auf die aktuelle Version 1.0), das auf einem Remote-Server alle Bmp-Dateien im System32-Verzeichnis auflistet:

$Expression = "get-childitem $env:systemroot\System32\*.bmp"
$CommandBytes = [System.Text.Encoding]::Unicode.GetBytes($Expression)
$EncodedCommand = [Convert]::ToBase64String($CommandBytes)
psexec <ServerName> cmd /c "echo . | powershell -EncodedCommand $EncodedCommand"

Für <ServerName> muss natürlich der Servername eingesetzt werden. Alles das funktioniert bereits mit der PowerShell 1.0 und stellt eine Art „Remoting für Arme“ dar.

Möchte man einen UI-Prozess starten (besonders beliebt ist zu Testzwecken Calc.exe) und dieser sichtbar sein, muss Psexec.exe mit dem Schalter -i aufgerufen werden.

Übrigens, manchen Menschen ist Bloggen ein inneres Bedürfnis und/oder eine Form der Selbstverwirklichung. Ich sehe es in erster Linie als einen kleinen und bescheidenen „Dienst“ an der kleinen, aber wachsenden deutschsprachigen PowerShell-Community und als eine kleine Ergänzung für mein Buch, das alle diese Themen nicht beinhaltet (und damit auch als ein wenig Werbung für dieses Werk).  In jedem Fall ist das „Bloggen“ eine mal mehr, mal weniger zeitintensive Angelegenheit. Nicht nur aus diesem Grund würde ich mich als kleine „Belohnung“ über den einen oder anderen Kommentar freuen (einen habe ich bereits erhalten;).

Dafür wünsche ich allen Lesern des Blogs ein frohes Jahr 2009, Gesundheit und Elan und kann nur jeden dazu aufrufen, sich nicht von dem allgemeinen „Krisenherbeigerede“ (das vor allem auf den Schreibtischen der deutschen Zeitschriftenredaktionen praktiziert wird – ich habe gerade die letzte Ausgabe der „Frankfurter Allgemeinen Sonntagszeitung“ nahezu ungelesen in den Papierkorb befördert) anstecken zu lassen.  Sein Handwerk zu beherrschen, die PowerShell ist dabei ein kleiner, aber in naher Zukunft aber deutlich an Bedeutung gewinnender, Bestandteil, ist eine Voraussetzung, um für Krisenzeiten, ob real oder virtuell, gut vorbereitet zu sein.

Advertisements

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s