Archiv der Kategorie: Powershell

LDAP mit der Powershell – Teil 2

Die Verbindung zu einem LDAP-Server haben wir ja schon im letzten Beitrag hergestellt. Heute wollen wir versuchen, eine einfache Abfrage abzusetzen und die Ergebnisse zu verarbeiten.

Zuerst brauchen wir dazu eine Instanz des System.DirectoryServices.Protocols.SearchRequest Objektes. Das Verhalten dieses Objektes können wir über seine Properties steuern:

  • Mittels DistinguishedName können wir die sog. Search-Base setzen, also den Einstiegspunkt im LDAP-Baum, an dem unsere Suche beginnen soll
  • Über Filter können wir den LDAP-Filter definieren. Wie genau jetzt ein LDAP-Filter aussieht erkläre ich jetzt nicht, das steht anderswo auch.
  • Das Enum [DirectoryServices.Protocols.SearchScope] definiert, wie „tief“ die suche im LDAP-Baum gehen soll, hier gibt es die Werte Base, OneLevel und SubTree. In diesem Beispiel verwenden wir SubTree damit geht die Suche von der Search-Base abwärts bis in den tiefsten Teilbbaum rein.
  • Tja, dann bleibt uns nur noch zu sagen, welche Attribute wir denn gerne zurückgeliefert haben wollen. Das können wir über die AttributesProperty steuern.

Wenn die Anfragedaten komplett sind, dann können wir über die LdapConnectiondie Anfrage absetzen und erhalten eine SearchResponsezurück.

Wenn jetzt keine Exception geworfen wurde, seit ihr schon ziemlich weit, dann gilt es die SearchResponseauszuwerten:

  • Wie unten im Beispiel gezeigt einfach in einer Schleife alle Entriesdurchgehen
  • Alle Attribute auslesen und deren Werte in einem neuen PSObjectabspeichern.
  • Das erzeugte Objekt mit seinen Werten ausgeben

Die Ausgabge des Scriptes könnt ihr dann in der Pipeline wie ihr wollt weiterverarbeiten.

Zum Abschluss natürlich noch das ganze Script zusammengefasst zum Abschreiben: 😉


In Teil 3 werden wir versuchen ein Attribut eines LDAP-Objektes zu ändern, also: Stay tuned….

LDAP mit der Powershell – Teil 1

Die Powershell bietet keine direkte Möglichkeit auf LDAP-Server  zuzugreifen und damit Abfragen (oder auch Änderungen) zu machen.

Es gibt zwar die Active-Directory-Commandlets, aber die sind nur sehr bedingt dazu geeignet um auf andere LDAP-Server (wie OpenDJ, OpenLDAP, ApacheDS) zuzugreifen.

Aber .NET to the Rescue, es gibt ja auch die Klassen rund um System.Directory.Services.Protocols mit denen man sich da etwas basteln kann.

Als ersten Schritt muss man der Powershell natürlich sagen, welche Assembly man da nun auf einmal verwenden will: Add-Type -AssemblyName 'System.DirectoryServices.Protocols, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Um sich nun mit einem Server zu verbinden (mit einer LDAPConnection) braucht man vorher noch zwei Sachen:

  • Das entsprechende NetworkCredentialfür einen LDAP-Bind (falls man keinen Anonyme-Authentifizierung verwenden will)
  • Einen LdapDirectoryIdentifierder beschreibt unter welcher Adresse und Port der LDAP-Server erreichbar ist.

Wenn man das ganze nun in etwas Code gießt sieht das so ähnlich aus:

Im nächsten Teil werden wir einmal eine einfache Abfrage versuchen…