Objekte jonglieren

Das Pipelining-Konzept der Windows PowerShell ermöglicht viele elegante administrative Lösungen, aber die direkte Objektweitergabe hat ihre Grenzen durch die noch geringe Zahl von Commandlets. Im zweiten Teil des Tutorials geht es daher um klassisches Scripting und den Zugriff auf Objektbibliotheken.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 4 Min.
Von
  • Dr. Holger Schwichtenberg

Von den 129 mit der Windows PowerShell 1.0 mitgelieferten Commandlets dienen leider nur wenige dem Zugriff auf Bausteine und Ressourcen von Windows. Mit Get-Process (Prozesse), Get-Service (Systemdienste), Get-ChildItem (Einträge in Dateisystem und Registry), Get-Acl (Zugriffsrechtelisten in Dateisystem und Registry), Get-EventLog (Ereignisprotokolle) und Get-PfxCertificate (Zertifikate) sind bereits alle eingebauten Commandlets genannt, die wesentliche Systeminformationen liefern.

Solange es nicht mehr Commandlets gibt, bleiben dem PowerShell-Anwender zwei Möglichkeiten: der Aufruf von klassischen Kommandozeilenwerkzeugen, die als .exe-Dateien (wie ping, netstat) sowie WSH-Skripte (wie iisweb.vbs) implementiert sind, oder die Nutzung von Objektbibliotheken. Schon im „Windows Script Host“ sind Administratoren mit zahlreichen Objektbibliotheken konfrontiert worden, zum Beispiel der WMI (Windows Management Instrumentation), dem ADSI (Active Directory Service Interface) und dem ADO (ActiveX Data Object). Diese auf COM (Component Object Model) basierenden Bibliotheken stehen in der PowerShell zur Verfügung, zusätzlich kann man jede mit dem .Net Framework geschriebene Softwarekomponente direkt verwenden. Wenn immer möglich, sollte man Objektbibliotheken anstelle von Kommandozeilenwerkzeugen einsetzen, denn Erstere liefern typisierte Daten und Letztere eine einzelne Zeichenkette, die man parsen müsste.

Zugang zu den COM- und .Net-Objektbibliotheken bietet das Commandlet New-Object. Als Parameter ist jeweils der Klassenname anzugeben, im Fall von COM-Klassen der Parametername -comObject voranzustellen. Das Ergebnis ist eine Objektreferenz auf eine Instanz der entsprechenden Klasse. Die Instanzen kann man direkt verwenden, um eine Methode aufzurufen, zum Beispiel:

(new-object System.Net.WebClient).DownloadString("http://www.ix.de")

Aus Gründen der Übersichtlichkeit und zur Wiederverwendung des Objekts sollte man die Referenz zunächst in einer Variablen ablegen. Variablenbezeichner beginnen mit dem Dollarzeichen. Im ersten Teil kam die Standardvariable $_ zum Einsatz, die das jeweils aktuelle Objekt in der Pipeline enthält. Wenn eine Befehlszeile mit einer Variablen beginnt, speichert die PowerShell das Ergebnis der folgenden Befehle in dieser ab. Die Variable ist gültig, solange die Konsole läuft oder bis der Anwender die Variable mit Clear-Variable löscht. Erst wenn man später eine Befehlszeile absetzt, die nur aus der Variablen besteht, erfolgt die Ausgabe des heruntergeladenen Inhalts (siehe Abbildung 1).

Beispielhafte Verwendung von Variablen in der PowerShell (Abb. 1)

Exkurs: Bei der Abbildung 1 fällt auf, dass die Eingabezeilen durchnummeriert sind, also nicht wie üblich der aktuelle Pfad am Zeilenanfang steht. Das ist ein Feature der „PowerShell Community Extensions“. Im gleichnamigen Kasten steht, was die kostenlose Erweiterung darüber hinaus noch bietet.

Mehr Infos

PowerShell Community Extensions

Die PSCX (PowerShell Community Extensions) ist ein von Microsoft gesteuertes Open-Source-Projekt, das Erweiterungen für die Windows PowerShell entwickelt. Sie bietet eine Reihe von Commandlets (vor allem für die Bereiche Netzwerkkonfiguration, Datenkonvertierung und Dateisystem) sowie Navigations-Provider für das Active Directory, den RSS-Speicher und den Global Assembly Cache von .Net. Durch die Installation der PSCX verändert sich das optische Erscheinungsbild der PowerShell- Konsole, insbesondere der Command Prompt und die Titelzeile. Die Datei profile.ps1, die beim Start der PowerShell ausgeführt wird, steuert diese Funktionen. Der Entwickler kann die Profildatei an eigene Bedürfnisse anpassen. Unter www.codeplex.com/PowerShellCX ist die kostenlose Erweiterung zu bekommen.

Mit der Methode GetTempName() im COM-Objekt Scripting.FileSystemObject kann man sich den Namen einer temporären Datei generieren lassen:

$fso = new-object -com "scripting.filesystemobject"
$fso.GetTempName()

Eingabeunterstützung für Objektvariablen in der PowerShell IDE (Abb. 2)

Die nächste Befehlsfolge öffnet den Internet Explorer mit einer bestimmten Seite:

$ie = new-object -com "InternetExplorer.Application"
$ie.Navigate("http://www.powershell-doktor.de")
$ie.visible = $true

Bei .Net-Objekten besteht die Möglichkeit, schon bei der Objekterzeugung einen Parameter für den Konstruktor anzugeben; COM kannte noch keine parameterbehafteten Konstruktoren. Die Parameter kann man mit oder ohne runde Klammern nach dem Klassennamen angeben. Die folgende Befehlsfolge greift auf ein Benutzerobjekt im Active Directory zu und ermittelt den „Security Identifier“ eines Benutzers.

$pfad= "LDAP://e02/CN=Holger Schwichtenberg,OU=Gf,DC=IT-Visions,DC=local"
$benutzer = New-Object DirectoryServices.DirectoryEntry($pfad)
$Benutzer.ObjectSID

Abbildung 2 zeigt, dass die PowerShell IDE IntelliSense-Unterstützung für die Objektvariablen gibt. Allerdings ist die Liste der Attribute nicht vollständig.

Den vollständigen Artikel finden Sie in der aktuellen Printausgabe.

Mehr Infos

(wm)