Printout Header
RSS Feed

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.

IADsNameTranslate Referenz im MSDN


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:

logonName = "SELFADSI\philippfoeckeler" 'hier den Namen des gewünschen Benutzers einsetzen Const ADS_NAME_INITTYPE_GC = 3 Const ADS_NAME_TYPE_NT4 = 3 Const ADS_NAME_TYPE_1779 = 1 Set nto = CreateObject("NameTranslate") 'Name Translate Objekt initialisieren und Namen umwandeln nto.Init ADS_NAME_INITTYPE_GC, "" nto.Set ADS_NAME_TYPE_NT4, logonName userDN = nto.Get(ADS_NAME_TYPE_1779) 'userDN enthält nun den kompletten LDAP Pfad... WScript.Echo userDN Set user = GetObject("LDAP://" & userDN) '...dieser kann zum Zugriff auf das Benutzerobjekt verwendet werden WScript.Echo user.logonCount
Wenn man den NetBIOS-NAmen der eigenen Domäne nicht kennt, dann hilft der SelfADSI-Artikel "Wie man den Namen der eigenen Active Directory Domäne ermittelt" weiter.


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:

logonName = "philippfoeckeler@selfadsi.org" 'hier den Namen des gewünschen Benutzers einsetzen Const ADS_NAME_INITTYPE_GC = 3 Const ADS_NAME_TYPE_USER_PRINCIPAL_NAME = 9 Const ADS_NAME_TYPE_1779 = 1 Set nto = CreateObject("NameTranslate") 'Name Translate Objekt initialisieren und Namen umwandeln nto.Init ADS_NAME_INITTYPE_GC, "" nto.Set ADS_NAME_TYPE_NT4, logonName userDN = nto.Get(ADS_NAME_TYPE_1779) 'userDN enthält nun den kompletten LDAP Pfad... WScript.Echo userDN Set user = GetObject("LDAP://" & userDN) '...dieser kann zum Zugriff auf das Benutzerobjekt verwendet werden WScript.Echo user.logonCount

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:

logonName = "philippfoeckeler" 'hier den Namen des gewünschen Benutzers einsetzen searchDomain = "DC=selfadsi,DC=de" 'den Domänen DN 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 = "(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