Inhaltsverzeichnis > Erweiterter Umgang mit AD Objekten > LDAP Search Werkstatt > Deaktivierte Benutzer finden
Deaktivierte Benutzer im Active Directory suchen und finden
Wir benutzen für diese Suche das Active Directory Attribut userAccountControl, in dem bei Domänencontrollern das Bit UF_SERVER_TRUST_ACCOUNT (8192) gesetzt ist.
Der SelfADSI-Artikel über LDAP Filter beschreibt genau, wie man nach einzelnen Flags in derartigen Bitfledern sucht. Zur allgemeinen Erläuterung von LDAP-Suchvorgängen lesen Sie das SelfADSI-Kapitel
"LDAP Objekte im Verzeichnis suchen".
Alle deaktivierten Benutzer der eigenen Domäne finden
Dieses Script findet alle deaktivierten Active Directory Benutzerin der Domäne, in der der aktuell angemeldete Benutzer Mitglied ist:
ldapFilter = "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=2))"
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
Einige Anmerkungen zu diesem Script:
Der LDAP Filter, mit dem hier allgemein Benutzer gesucht werden, lautet (samAccountType=805306368). Beachten Sie, dass dies effizienter und schneller als der Filter ist, der hier sonst oft dafür verwendet wird: (&(objectCategory=person)(objectClass=user)).
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 deaktivierten Benutzer in irgendeiner Domäne/OU finden
Dieses Script findet alle deaktivierten 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)(userAccountControl:1.2.840.113556.1.4.803:=2))"
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