heise online Logo
Anmelden
Menü
  • c't – Magazin für Computertechnik
  • iX – Magazin für professionelle Informationstechnik
  • MIT Technology Review – Das Magazin für Innovation von Heise
  • c't Fotografie - Das Magazin rund ums digitale Bild
  • Mac & i – Nachrichten, Tests, Tipps und Meinungen rund um Apple
  • Make – Kreativ mit Technik
  • Alle Magazine im Browser lesen
IT News
  • Newsticker
  • heise Developer
  • heise Netze
  • heise Open Source
  • heise Security
Online-Magazine
  • heise+
  • Telepolis
  • heise Autos
  • TechStage
  • tipps+tricks
Services
  • Stellenmarkt heise Jobs
  • Weiterbildung
  • heise Download
  • Preisvergleich
  • Whitepaper/Webcasts
  • DSL-Vergleich
  • Netzwerk-Tools
  • Spielen bei Heise
  • Loseblattwerke
  • iMonitor
  • IT-Markt
Heise Medien
  • heise Shop
  • Abo
  • Veranstaltungen
  • Arbeiten bei Heise
  • Mediadaten
  • Presse
Anzeige Go! Schule morgen
Newsletter heise-Bot heise-Bot Push Nachrichten Push Push-Nachrichten
iX Magazin für professionelle Informationstechnik
  • Kontakt
  • Forum
  • News
    • 7-Tage-News
    • News-Archiv
  • Heftartikel
    • Aktuelles Heft
    • Alle Hefte
    • Artikel-Archiv
  • Abo & Shop
    • Abonnieren
    • Einzelhefte kaufen
    • Heftarchiv auf DVD und USB-Stick
    • Sonderhefte
    • iX extra
  • Apps
    • iOS
    • Android
    • Amazon-Store
    • FAQ zur iX-App
  • Veranstaltungen
  • Service
    • Listings/Downloads
    • Security-Awareness
    • Die iX-Redaktion
    • Newsletter
    • NiX Spam
    • Mediadaten
    • Presse-Informationen

  1. iX
  2. Heft
  3. 10/2007
  4. Eigenbau

Eigenbau

Holger Schwichtenberg

Die Windows PowerShell besitzt einen vorgegebenen Satz von Commandlets, aber der Administrator kann die vorhandenen um zusätzliche ergänzen. Eigene Commandlets sind entweder als Skriptdateien oder in .Net-DLLs implementiert.

Im dritten Teil des PowerShell-Tutorials geht es um die Techniken die immanenten Commandlets durch eigene zu ergänzen. Die einfache Methode, eigene Commandlets zu erstellen und damit die Fähigkeiten der Shell zu erweitern, sind in der PowerShell-Sprache geschriebene Funktionen, die der Entwickler in Skriptdateien verpackt. Solche Befehle heißen funktionsbasierte Commandlets und bestehen aus folgenden Teilen:

  • Mindestens eine in der PowerShell-Sprache geschriebene Funktion, deren Name wie ein Commandlet aus Verb und Substantiv aufgebaut ist,
  • eine Liste von Parametern,
  • ein Unterblock mit dem Namen begin, den die PowerShell einmalig zu Beginn der Verarbeitung ausführt,
  • ein Unterblock process, der für jedes Objekt in der Pipeline ausgeführt wird sowie
  • ein Unterblock end, der einmalig zum Ende der Verarbeitung läuft.

Beachten muss man, dass die PowerShell process auch dann mindestens einmal aufruft, wenn die Pipeline leer ist.

Eigene Commandlets für LDAP-Server

Listing 1 zeigt die Implementierung der funktionsbasierten Commandlets Get-LDAPObject und Get-LDAPChildren, deren Aufgabe es ist, Einträge aus LDAP-Servern auszulesen. Ersteres prüft, ob das aktuelle Objekt $_ eine Zeichenkette ist. Falls ja, erzeugt das Commandlet eine zugehörige Instanz der .Net-Klasse System.DirectoryServices.DirectoryEntry und legt es in die Pipeline als Ausgabeobjekt. Die Zeichenkette kann der Administrator wahlweise als Parameter

Get-LDAPObject
"LDAP://E02/ou=Dozenten,dc=
it-visions,dc=local"

oder durch die Pipeline

"LDAP://E02/ou=Dozenten,dc=
it-visions,dc=local"
| Get-LDAPObject

übergeben.

Listing 1: Funktionsbasierte Commandlets

# Get single LDAP object
function Get-LDAPObject
{
param([string[]]$LDAPPath)
begin {}
process
{
if ($_)
{
if ($_ -is [string])
{
new-object system.directoryservices.directoryEntry($_)
}
else
{
throw "input must be [string]."
}
}
}
end
{
if ($LDAPPath)
{
foreach ($Path in $LDAPPath)
{
new-object system.directoryservices.directoryEntry($Path)
}
}
}
}

# Hilfsroutine
function getContainer([string] $path)
{
$con = new-object system.directoryservices.directoryEntry($path)
$con.PSBase.Children
}
# Get content of an LDAP container
function Get-LDAPChildren
{
param([string[]]$LDAPPath)
begin {}
process
{
if ($_)
{
if ($_ -is [string])
{
getContainer($_)
}
elseif ($_ -is [System.DirectoryServices.DirectoryEntry])
{
getContainer($_.PSBase.Path)
}
else
{
throw "Pipeline input must be [string] or
[System.DirectoryServices.DirectoryEntry]."
}
}
}
end
{
if ($LDAPPath)
{
foreach ($Path in $LDAPPath)
{
getContainer($Path)
}
}
}
}

# Define aliases for commandlet functions
Set-Alias LDO Get-LDAPObject
Set-Alias LDC Get-LDAPChildren
# Confirm installation
"Function-based commandlets for LDAP successfully installed!"

Get-LDAPChildren zum Auflisten des Inhalts eines Containers ist etwas aufwendiger, weil hier die Eingabe wahlweise ein Pfad oder ein Objekt des Typs System.DirectoryServices.DirectoryEntry sein kann. Folgende vier Syntaxformen sind demzufolge erlaubt:

 Get-LDAPChildren
"LDAP://E02/ou=Dozenten,dc =
it-visions,dc=local"
______________________________

"LDAP://E02/ou=Dozenten,dc=
it-visions,dc=local"
| Get-LDAPChildren
Get-LDAPObject
______________________________

"LDAP://E02/ou=Dozenten,dc=
it-visions,dc=local"
| Get-LDAPChildren
______________________________

"LDAP://E02/ou=Dozenten,dc=
it-visions,dc=local"
| Get-LDAPObject
| Get-LDAPChildren

Die Rückgabe sind wieder Instanzen von System.DirectoryServices.DirectoryEntry, die andere Commandlets verarbeiten können. In den Downloads auf dem iX-FTP-Server ist eine ausführliche Version von Listing 1 vorhanden, in dem die Commandlets Add-LDAPObject zum Anlegen eines Verzeichnisobjekts und Remove-LDAPObject zum Löschen eines Verzeichnisobjekts realisiert sind.

Der Code aus Listing 1 ist in einer PowerShell-Skriptdatei mit der Dateinamenserweiterung ps1 (s. Teil 2 des Tutorials in iX 9/07) zu speichern. Diese Datei muss der Anwender in die Shell einbinden. Das geschieht mit dem Operator „.“ und dem vollständigen Pfad zur Skriptdatei (das Verfahren nennen die PowerShell-Entwickler „dot sourcing“), beispielsweise mit:

. H:\ix\LDAP_Commandlets.ps1

Der letzte Befehl in der Skriptdatei sorgt dafür, dass der Anwender einen Bestätigungstext erhält.

Den obigen Befehl legt man üblicherweise in der profile.ps1-Datei ab, damit er beim Start der Shell integriert wird. Wichtig ist, dass man das Skript nach jeder Quelltextänderung neu in die PowerShell einbinden muss. Danach sind alle in der Skriptdatei enthaltenen funktionsbasierten Commandlets wie normale Commandlets über die Konvention Verb-Substantiv (s. Teil 1, iX 8/07) verwendbar. Die Aliasdefinitionen am Ende der Skriptdatei mit Set-Alias ermöglichen, dass die Abkürzungen LDC und LDO anstelle der Commandlet-Namen zur Verfügung stehen.

Neue Befehle in beliebigen .Net-Sprachen erstellen

Statt der auf PowerShell-Skriptfunktionen basierten Commandlets kann man sie in einer beliebigen .Net-Programmierspache erstellen und in kompilierter Form als DLL (alias „Snap-In“) verbreiten. Dazu benötigt der Entwickler aber Grundkenntnisse des .Net Framework und einer der rund 70 .Net-basierten Programmiersprachen wie C#, VB.Net oder C++/CLI.

Zum Erstellen eines Commandlets sollte der Entwickler eine Variante von Visual Studio 2005 oder 2008 verwenden. Es reicht dabei, wenn man eine der kostenfreien Expressvarianten (Visual C# Express, Visual C++ Express oder Visual Basic Express) nutzt. Grundsätzlich ist eine Erstellung von Commandlets auch mit einem einfachen Texteditor und den im .Net Framework mitgelieferten Kommandozeilen-Compilern möglich. Dies ist jedoch deutlich mühsamer als die Bearbeitung im Visual Studio.

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

Tutorialinhalt

  • Teil I: Commandlets, Pipelines und Navigation
  • Teil II: Skripte und WMI-Einbindung
  • Teil III: Erweiterung durch eigene Commandlets
  • Teil IV: Datenzugriff auf Datenbanken, Text- und XML-Dateien
Kommentare lesen (3 Beiträge)

Teile diesen Beitrag

https://www.heise.de/-506804 Drucken
Anzeige
  • Udemy Sale: Bis zu 85 Prozent Rabatt
  • Mehr Nachhaltigkeit durch modernes Deployment
  • Gaia-X – die souveräne europäische Cloud
  • Chrome OS: Das bessere Betriebssystems
  • So geht intelligentes Gebäudemanagement
  • OPPO Find X5 Pro: Fotos und Videos auf professionellem Niveau
  • Zuverlässiger Zugriff dank Zero Trust
  • Wie IT zu nachhaltigem Wirtschaften beitragen kann
  • Sicher entwickeln im Open-Source-Universum
  • Kundenservice mit künstlicher Intelligenz
Eigenwerbung
Aktuelles Sonderheft
iX Kompakt Sicheres Active Directory

iX Kompakt Sicheres Active Directory

Im heise Shop erhältlich als Heft, PDF oder als exklusives Bundle mit Rabatt

Aktuelle Inhalte in der iX-App
Apps für iX

iX-App für Android, iOS und Kindle Fire

iX können Sie auch auf Tablets und Smartphones unter Android und iOS lesen – als Plus-Abonnent sogar ohne zusätzliche Kosten.

Die Apps gibt es im App Store, bei Google Play und im Amazon App Shop

We Are Developers!

Verlagsbeilage: We Are Developers!

IT- und Technologieunternehmen stellen sich vor

Verlagsbeilage: Innovation in deutschen Unternehmen

Rechenzentren und Infrastruktur

Verlagsbeilage: Server, Kabel, Cloud-Computing

iX Jetzt iX kennenlernen

Eigenwerbung
ix testen

3x iX testen

  • 3x iX als Heft oder digital
  • Über 30% Rabatt
  • Inkl. Prämie nach Wahl
Zum Angebot
  • News
    • 7-Tage-News
    • News-Archiv
  • Heftartikel
    • Aktuelles Heft
    • Alle Hefte
    • Artikel-Archiv
  • Abo & Shop
    • Abonnieren
    • Einzelhefte kaufen
    • Heftarchiv auf DVD und USB-Stick
    • Sonderhefte
    • iX extra
  • Apps
    • iOS
    • Android
    • Amazon-Store
    • FAQ zur iX-App
  • Veranstaltungen
  • Service
    • Listings/Downloads
    • Security-Awareness
    • Die iX-Redaktion
    • Newsletter
    • NiX Spam
    • Mediadaten
    • Presse-Informationen
    • Kontakt
    • Mediadaten
    • Presse-Infos
  • Datenschutz
  • Cookies & Tracking
  • Impressum
  • Kontakt
  • Barriere melden
  • Mediadaten
  • 348909
  • Content Management by InterRed
  • Hosted by Plus.line
  • Copyright © 2022 Heise Medien