LDAP Abfrage im AD

Sev7eNup

Lieutenant
Registriert
Feb. 2008
Beiträge
548
Hallo zusammen,

ich komme gerade bei einer kleinen AD Auswertung über LDAP mittels Powershell nicht weiter.

Folgender Code liegt zu Grunde:

Code:
$ADsearcher = New-Object System.DirectoryServices.DirectorySearcher 
$ADsearcher.SearchRoot  = New-Object System.DirectoryServices.DirectoryEntry($LdapPath)
$ADsearcher.Filter = "(objectClass=*)"
$allusers = $ADsearcher.findall()

Verwendeter LDAP-Path: "LDAP://cn=<GRUPPE>,ou=<unterou1>,ou=<unterou2>,ou=<ou3>,dc=test,dc=domain,dc=de"

Das Attribut SearchRoot des ADSearchers liefert mir auch richtige, brauchbare Werte für die LDAP Abfrage zurück. Als Beispiel sind die Attribute CN, Member etc. alle richtig gefüllt. Allerdings wird anschließend kein Benutzer durch ADSearcher.FindAll in $AllUsers geschrieben. Die Variable bleibt komplett leer.

Nach meinem Verständnis müsste er doch alle Benutzer dieser Gruppe in die Variable $AllUsers schreiben, weil ich auch nichts filtere.

Bin für jede Hilfe dankbar.
Ergänzung ()

Mittlerweile habe ich rausgefunden, dass mir mit der jetzigen Abfrage nur der Name der Gruppe zurückgegeben wird, nicht die User der Gruppe... daher war der Ansatz nicht der Beste.

Mit Hilfe des LDAP Filters kann man allerdings direkt das AD nach bestimmten Kriterien durchsuchen. Ich habe ein Beispiel für C# gefunden, indem mit folgenden Zeile bestimmt wird, dass nur nach Gruppen mit dem Namen 'group' gesucht werden soll.

Ich bekopmme es aber nicht in Powershell transferiert.

Code:
searcher.Filter = string.Format(@"(&(objectClass=group)(cn={0}))", group);

Jemand eine Idee?
Ergänzung ()

Auch wenn ich einen Monolog halte hier die Lösung des Problems.

LDAP bietet bereits mit dem Filter gezielt die Möglichkeit auf eine bestimme Gruppe zu schauen. Nachfolgender Code funktioniert und liest alle User einer bestimmten Gruppe aus dem AD aus. Anschließend können für jeden User sämtliche Properties abgefragt werden, wie z.b DisplayName, Mail etc...

Code:
$ADsearcher = New-Object System.DirectoryServices.DirectorySearcher 
$ADsearcher.Filter = [string]::Format("(&(objectClass=group)(cn={0}))", "GROUPNAME" )

foreach($SearchResult in $ADsearcher.FindAll()) {
	foreach($member in $SearchResult.Properties["member"]) {
		$memberResult = New-Object System.DirectoryServices.DirectoryEntry([string]::Format("LDAP://{0}", $member))
		Write-Host $memberResult.Properties["sAMAccountName"].value "-"  $memberResult.Properties["mail"].value
                  }
}
 
Zuletzt bearbeitet:
Hier mal eine kleine Ergänzung:

Dieses Besipiel zeigt asl Ergebniss alle AD-Objekte aus der OU Benutzer an:
Code:
$root = New-Object System.DirectoryServices.DirectoryEntry
$user = $root.get_Children().find('ou=Benutzer')
$user | fl *

Natürlich muss der Code so angepasst werden das er bei euch funktioniert aber im Grunde ganz einfach.

Bei meherern OU's mit Benutzern sollte man dann aber schon eine Suche starten.

Beispiel:
Code:
$adsearch = new-object directoryservices.directorysearcher;
$adsearch.filter = "(objectclass=user)";
$adsearch.PropertiesToLoad.AddRange(@("name"))
$adsearch.Container
$users = $adsearch.findall()
$users

Hierbei wird nach Objekten der class User gesucht. Der Befehl AddRange sagt an das zusätzlich noch der name ausgegeben werden soll.

Beide Bespiele sind recht kurz und verständlich weshalb ich sie recht praktisch finde.

Hoffe ich konnte helfen :D
 
Zurück
Oben