Name Translation : Wie man den LDAP Pfad eines Benutzers ermittelt
... wenn man nur den Anmeldenamen kennt.
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:
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
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
Wend

