Printout Header
RSS Feed

Benutzer Accounts im Active Directory suchen und finden


In den meisten Fällen, in denen ich Beispielscripte für die LDAP-Suche nach Active Directory Benutzern sehe, wird dort folgender LDAP Filter verwendet:

(&(objectClass=user)(objectCategory=person))              <- Ineffizient !!

Dies ist jedoch nicht die optimale Methode, um User Accounts zu suchen. Der Filter ist so gebaut, dass intern unnötig viel Server-Leistung verbraucht wird. Der Grund: Die zwei Filterkriterien "objectClass" und "objectCategory" - dadurch wird die technische Suche in der AD-Datenbank für den Server komplexer als sie es sein müßte. In Domänen mit einer relativ geringen Benutzeranzahl spielt das vielleicht keine große Rolle, es wird aber relevant, wenn eine Bereich durchsucht werden soll, in dem sich viele tausend Benutzerobjekte befinden.

Einen LDAP Filter mit nur einem Kriterium zu verwenden , also nur

(objectClass=user)                  <- Falscher Filter für die Suche nach User Objekten !!

oder nur

(objectCategory=person)         <- Falscher Filter für die Suche nach User Objekten !!

ist auch keine gute Idee, denn dadurch werden jeweils nicht nur Benutzer, sondern auch Computer-Objekte oder Kontakte als Ergebnis zurückgeliefert. Schwieriger zu merken, aber viel effiziernter ist ein Filter, der das Attribut 'sAMAccountType' verwendet: Bei User Objekten hat dieses Attribut immer den Wert 805306368 - und das Attribut ist in der AD-Datenbank für schnelle Suchvorgänge indiziert. Der perfekte LDAP Filter für die Suche nach Benutzern lautet also


(samAccountType=805306368)    <- Effizienter Filter für User Objekte :)


Die folgenden Beispiele zeigen die Verwendung dieses Filter in Verzeichnis Scripts. Zur allgemeinen Erläuterung von LDAP-Suchvorgängen lesen Sie das SelfADSI-Kapitel "LDAP Objekte im Verzeichnis suchen".


Alle Benutzer Accounts der eigenen Domäne finden


Dieses Script findet alle Active Directory Benutzer Accounts in der Domäne, in der der aktuell angemeldete Benutzer Mitglied ist:

ldapFilter = "(samAccountType=805306368)" Set rootDSE = GetObject("LDAP://rootDSE") domainDN = rootDSE.Get("defaultNamingContext") Set ado = CreateObject("ADODB.Connection") ado.Provider = "ADSDSOObject" ado.Open "ADSearch" Set objectList = ado.Execute("<LDAP://" & domainDN & ">;" & ldapFilter & _  ";distinguishedName,samAccountName,displayname,userPrincipalName;subtree") While Not objectList.EOF userDN = objectList.Fields("distinguishedName") logonName = objectList.Fields("samAccountName") On Error Resume Next displayName = "" : displayName = objectList.Fields("displayname") logonNameUPN = "" : logonNameUPN = objectList.Fields("userPrincipalName") On Error Goto 0 WScript.Echo logonName & ";" & logonNameUPN & ";" & displayName & ";" & userDN objectList.MoveNext Wend

Anmerkung zu diesem Script:

Wenn wir Attribute auslesen, benutzen wir hier einen Trick um Laufzeitfehler zu vermeiden für den Fall, dass diese Attribute beim betreffenden Objekt garnicht existieren. Erst setzen wir die Variable auf einen Leer-String, dann versuchen wir den Attributwert zu lesen - für diese Befehle wird kurz die Laufzeitfehlerbehandlung deaktiviert. Durch den trennenden Doppelpunkt lassen sich hier zwei VBScript-Befehle in einer einzigen Zeile schreiben:

... On Error Resume Next displayName = "" : displayName = objectList.Fields("displayname") On Error Goto 0 ...

Alle Benutzer Accounts des eigenen Forests finden


Dieses Script findet alle Benutzer in dem Active Directory Forest, in der der aktuell angemeldete Benutzer Mitglied ist. Bitte beachten, dass hier nur diejenigen Attribute durchsucht werden können, die auch im Global Catalog enthalten sind. Das betrifft den Aufbau des Suchfilters als auch die Liste der Attribute, die in der Suche angefordert werden:


ldapFilter = "(samAccountType=805306368)" Set aoi = CreateObject("ADSystemInfo") 'die Forest Suchbasis ermitteln gcBase = aoi.ForestDNSName Set ado = CreateObject("ADODB.Connection") ado.Provider = "ADSDSOObject" ado.Open "ADSearch" Set objectList = ado.Execute("<GC://" & gcBase & ">;" & ldapFilter & _  ";distinguishedName,samAccountName,displayname,userPrincipalName;subtree") While Not objectList.EOF userDN = objectList.Fields("distinguishedName") logonName = objectList.Fields("samAccountName") On Error Resume Next displayName = "" : displayName = objectList.Fields("displayname") logonNameUPN = "" : logonNameUPN = objectList.Fields("userPrincipalName") On Error Goto 0 WScript.Echo logonName & ";" & logonNameUPN & ";" & displayName & ";" & userDN objectList.MoveNext Wend

Alle deaktivierten Benutzer in irgendeiner Domäne/OU finden


Dieses Script findet alle Benutzer in der angegebenen Domäne oder OU. Verwenden Sie hier den passenden LDAP Pfad für die von Ihnen gewünschten Domänen bzw. OU. Außerdem können Sie hier noch andere Anmeldedaten für den Suchvorgang (Benutzernamen und Passwort) angeben:

searchDN = "DC=example,DC=com" 'den Suchcontainer / die Domäne angeben serverName = "192.168.0.66" 'den Namen/die Adresse des Domänencontrollers angeben userName = InputBox("Enter user name","Credentials") 'möglich wäre auch einen statischen Username, z.B: "EXAMPLE\userXYZ" password = InputBox("Enter password","Credentials") 'möglich wäre auch ein statisches PAsswort, z.B. "P@ssw0rd" ldapFilter = "(samAccountType=805306368)" Set ado = CreateObject("ADODB.Connection") ado.Provider = "ADSDSOObject" ado.Properties("User ID") = userName ado.Properties("Password") = password ado.Properties("Encrypt Password") = True ado.Open "ADSearch" Set objectList = ado.Execute("<LDAP://" & serverName & "/" & searchDN & ">;" & ldapFilter & _ ";distinguishedName,samAccountName,displayname,userPrincipalName;subtree") While Not objectList.EOF userDN = objectList.Fields("distinguishedName") logonName = objectList.Fields("samAccountName") On Error Resume Next displayName = "" : displayName = objectList.Fields("displayname") logonNameUPN = "" : logonNameUPN = objectList.Fields("userPrincipalName") On Error Goto 0 WScript.Echo logonName & ";" & logonNameUPN & ";" & displayName & ";" & userDN objectList.MoveNext Wend