Name Translation : Wie man den LDAP Pfad eines Benutzers ermittelt
... wenn man nur den Anmeldenamen kennt. Oder: Wie kann ich den vollen Distinguished Name (DN) eines Benutzers oder einer Gruppe ermitteln?
Dabei kann es sich um den herkömmlichen NT Anmeldenamen handeln (das ist der so genannte sAMAccountName, z.B. SELFADSI\philippfoeckeler), oder um den moderneren User Principal Name (UPN, z.B. philippfoeckeler@selfadsi.org)
Als bequeme Methode bietet sich hier das spezielle IADsNameTranslate Interface an. Damit können die Namen von Benutzern im Active Directory von einem Format ins andere übertragen werden. Nicht nur Anmeldenamen wie in unserem Fall, sondern auch Anzeigenamen, GUID Strings oder Canonical Names (z.B. selfadsi.org / Users / Philipp Foeckeler). Dies funktioniert dann übrigens nicht nur mit Benutzern, sondern auch mit Gruppen, Kontakten, Computer-Accounts oder anderen Objekten.
Das wichtigste Format, das wir durch die Umwandlung mit IADsNameTranslate für einen Benutzer ermitteln wollen, ist der LDAP Pfadname (oder auch Distinguished Name), denn diesen benötigen wir, wenn wir auf ein Active Directory Objekt zugreifen wollen. Im Fachjargon der IADsNameTranslate Schnittstelle heißt dieser LDAP DN auch "1779-Name", da im RFC 1779 die ursprünglichen Distinguished Names beschrieben wurden.
Auf einen Benutzer zugreifen, dessen NT Anmeldename bekannt ist
Dieses Script findet den LDAP Pfad (=Distinguished Name) eines Active Directory Benutzer Accounts anhand seines NT-Anmeldenamens:
Auf einen Benutzer zugreifen, dessen UPN (User Principal Name) bekannt ist
Dieses Script findet den LDAP Pfad (=Distinguished Name) eines Benutzers anhand seines User Principal Names:
Name Translation, wenn man nicht am Forest angemeldet ist
Das IADsNameTranslate Interface ist sehr bequem, hat jedoch einen Nachteil: Es funktioniert nur, wenn das Script an einer Station läuft, an der man als Benutzer im betreffenden AD Forest angemeldet ist. Man kann jedoch den LDAP PFad auch "von weitem" ermitteln, wenn man auf eine LDAP Suche über ADO zurückgreift. Die Prozedur ist jedoch viel aufwändiger:
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 = "(samAccountName=" & logonName & ")" 'man könnte hier auch nach UPN Namen suchen... 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("displayname") On Error Goto 0 WScript.Echo logonName & " " & logonNameUPN & " " & displayName & " " & userDN objectList.MoveNext Wend