LDAP Abfrage mit PowerShell realisieren
Mit PowerShell ist es möglich eine LDAP Abfrage zu realisieren. Denn oft stehen Snap-Ins für das Active Directory oder andere Tools nicht zur Verfügung. Außerdem ist die Weiterverarbeitung von Daten in solchen Skripten sehr einfach und deswegen sehr attraktiv.
Was ist das Lightweight Directory Access Protocol?
Das Lightweight Directory Access Protocol (LDAP) ist ein Netzwerk-Protokoll zur Abfrage von Verzeichnisdiensten. Ein sehr bekannter Verzeichnisdienst ist das Active Directory (AD). Da LDAP ein gängiges Protokoll ist, kann dies auch mit PowerShell genutzt werden.
LDAP Abfrage mit PowerShell
Um es einfacher zu erklären, nutze ich als Beispiel der Abfrage das Active Directory. In PowerShell wird ein neues Objekt der System.DirectoryServices benötigt. Außerdem ist natürlich der Such-Pfad wichtig:
$yourOU = "LDAP://OU=YOUROU,DC=YOUR,DC=DOMAIN" $LDAPSearcher = New-Object System.DirectoryServices.DirectorySearcher
Nun muss der Suchpfad auf das PowerShell Objekt angewendet werden. Hierzu wird das Attribut SearchRoot verwendet. Da wir in unserem Beispiel per LDAP lediglich die Benutzer des Systems auslesen möchten, wird auch noch ein Filter gesetzt:
# Such-Pfad setzen $LDAPSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry($yourOU) # Filter auf "Benutzer" reduzieren $LDAPSearcher.Filter = "(&(objectCategory=User))"
Nun kommt noch hinzu, dass sich die LDAP-Objekte oft nicht in der ersten Ebene befinden, sondern in Sub-OUs. Deswegen muss die PowerShell Abfrage rekursiv durchgeführt werden. Das bedeutet, dass auch Unter-Ordner einbezogen werden. Auch hierfür gibt es ein Attribut namens SearchScope.
Außerdem werden bei LDAP Abfragen immer nur 2000 Elemente ausgegeben, da dies der Standard-Wert ist. Möchte man aber mehr Ergebnisse erhalten, muss die PageSize erhöht werden. Auch das ist in einem PowerShell Script möglich.
# rekursiv: auch Sub-OUs $LDAPSearcher.SearchScope = "Subtree" # Erhoeht die Ausgabe der Werte von 2.000 auf 10.000 $LDAPSearcher.PageSize = 10000
Die eigentliche LDAP-Abfrage wird dann mit FindAll()
ausgeführt. In PowerShell lässt man die Ergebnisse am Besten in eine Variable schreiben. Mit einer foreach-Schleife ist dann die Ausgabe von Werten ein Kinderspiel:
# Abfrage starten $users = $LDAPSearcher.FindAll() # Einzelne Werte ausgeben foreach ($u in $users){ $output = $u.Properties["name"] $output += "(" + $u.Properties["samaccountname"] + ")" write-host $output }
Werden all diese Teile dann zu einem kompletten PowerShell Script zusammen gefügt, so sollte es aussehen wie im Bild (oben). Beim Ausführen der LDAP Abfrage wird der Verzeichnisdienst ausgelesen und die Ergebnisse in eine Variable geschrieben. Welche Werte dann aus dem Array gelesen werden sollen, oder welche ausgegeben werden, kann dann mit der Schleife geschehen.