von postNils Kaczenski post28. Juli 2004, 14:59 Uhr
post Kategorie: AD: Erweiterte Abfragen, Active Directory, Scripting

Das folgende Skript gibt den Wert eines beliebigen Attributs aus dem Active Directory für einen User zurück, dessen Logon-Name (SAM-Name, sAMAccountName) bekannt ist. Das ist nützlich, wenn beispielsweise zu der bekannten Systemvariablen %username% die Mailadresse, die Telefonnummer, der LDAP-Pfad oder irgendwas anderes aus dem AD erfragt werden soll.

Es gibt auch die Möglichkeit, das COM-Objekt "ADSystemInfo" zu nutzen, das eine ganze Reihe von Informationen über den gerade angemeldeten Benutzer zurückgibt. In vielen Situationen ist das die einfachste und schnellste Variante. Das hier gezeigte Script hat aber den Vorteil, dass es beliebige Logonnamen zu beliebigen AD-Feldern auflösen kann, nicht nur den des gerade angemeldeten Users. Dadurch ist es sehr flexibel.

Funktionsweise: Die aufzurufende Funktion "SAM2ADInfo" erwartet zwei Parameter: der erste ist der Loginname, der zweite ist der ADSI-Name des Feldes, das zurückgegeben werden soll. Eine Übersicht über wichtige Feldnamen findet sich hier.

  1. strLDAP = SAM2ADInfo("NilsK", "mail")
  2.  
  3. function SAM2ADInfo(strSAMName, strField)
  4. ' Funktion: Übersetzt den übergebenen SAMAccountName per ADS-Abfrage in ein beliebiges ADS-Feld
  5. ' Eingabeparameter: strSAMName: Der NT-Anmeldename; strField: ADSI-Name des erwarteten Feldes
  6. ' Rückgabewert: Der gefundene Wert oder ein Leerstring
  7.  
  8.     Dim objConn
  9.     Dim objCommand
  10.     dim objArgs
  11.  
  12.     On Error Resume Next
  13.  
  14.  
  15.     'Create ADO connection object for Active Directory
  16.     Set objConn = CreateObject("ADODB.Connection")
  17.     objConn.Provider = "ADsDSOObject"
  18.     objConn.Open "Active Directory Provider"
  19.     if checkit("Fehler beim ADO-Zugriff auf Active Directory!") then exit function
  20.  
  21.     'Create ADO command object for the connection.
  22.     Set objCommand = CreateObject("ADODB.Command")
  23.     objCommand.ActiveConnection = objConn
  24.     if checkit("Fehler beim Definieren des ADO-Kommandos!") then exit function
  25.  
  26.     'Get the ADsPath for the domain to search.
  27.     Set objRoot = GetObject("LDAP://rootDSE")
  28.     strDomain = objRoot.Get("defaultNamingContext")
  29.     Set objDomain = GetObject("LDAP://" & strDomain)
  30.     if checkit("Fehler beim Ansprechen des Active Directory!") then exit function
  31.  
  32.     'Abfrage
  33.     strSQL = "SELECT " & strField & " FROM '"
  34.     strSQL = strSQL & "LDAP://" & strDomain & "' WHERE sAMAccountName = '" & strSAMName & "'"
  35.  
  36.     'Assemble the commandtext.
  37.     objCommand.CommandText = strSQL
  38.     if checkit("Fehler beim Übergeben des Kommandos!") then exit function
  39.  
  40.     'Execute the query.
  41.     Set objRS = objCommand.Execute
  42.     if checkit("Fehler beim Ausführen der Suche im Active Directory!") then exit function
  43.  
  44.     strOutput = ""
  45.     strOutput = objRS.Fields(0).value
  46.  
  47.     on error goto 0
  48.  
  49.     SAM2ADInfo = strOutput
  50.  
  51. end function
  52.  
  53.  
  54. ' Fehlerprüfung
  55. function checkit(Nachricht)
  56.     checkit = false
  57.     if err.number <>0 then
  58.         Nachricht = Nachricht & " [" & err.description & " (" & err.number & ")]"
  59.                 wscript.echo Nachricht
  60.         err.clear
  61.         checkit=true
  62.     end if
  63. end function

OU des angemeldeten Benutzers herausfinden

Um etwa die OU des angemeldeten Benutzers im Logonscript herauszufinden, ersetze man die erste Zeile des obigen Skripts durch folgenden Block:

  1. Set objNet = CreateObject("Wscript.Network")
  2. strUser = objNet.UserName
  3. WScript.Echo SAM2ADInfo(strUser, "distinguishedName")