Active Directory mit Excel auslesen

03. April 2008 von Werner Mager · Gelesen: 8377 · heute: 1

Dieser Artikel beschäftigt sich damit, wie man in einer Microsoft Windows Domäne Gruppen oder Logins auflösen kann um z.B. zu prüfen, wer Mitglied in einer Gruppe ist. Der komfortabelste Weg, den ich gefunden habe, ist aus Microsoft Excel heraus.

Das mächtigste Werkzeug für den Zugriff auf das Active Directory ist sicherlich das Programm “Active Directory Users and Computers” aus den administrativen Tools (kann einfach bei Microsoft heruntergeladen werden und läuft auch auf XP-Clients). Dieses Tool kann oder möchte man jedoch nicht immer einfach so beim Kunden installieren. Eine einfache Alternative ist die Suche im Active Directory, die jeder Client von Haus aus kann. Man findet sie über Start > Search > For People.

Hiermit können sowohl Gruppen als auch Benutzer gefunden werden. Man kann sowohl nach dem Namen oder auch dem W2K-Login suchen.

Eine komfortable Liste erhält man dabei aber trotzdem nicht. Daher habe ich ein bisschen mit VBA-Makros experimentiert und mir schließlich ein Excel-Blatt erstellt, über dass ich zum einen eine Gruppe auslesen und zum anderen auch eine Liste von Logins in Namen auflösen kann.

Um die Funktion des Active Directories nutzen zu können, muss im VBA-Editor ein Verweis auf die “Actvie DS Type Library” eingebunden werden:

Nun stehen direkt die Objekte für den Zugriff auf das Active Directory zur Verfügung, z.B. kann mit folgenden 2 Zeilen die Gruppe “Administrators” geöffnet werden:

Dim grp As ActiveDs.IADsGroup
Set grp = GetObject("WinNT://sternico.local/Administrators,group")

Die Mitglieder eine Gruppe lassen sich wie folgt auslesen:

Dim member As ActiveDs.IADsUser
For Each member In grp.Members
  member.GetInfo
  debug.print "Login:" & member.Name
  debug.print "Name:" & member.FullName
Next

Und einen User (in diesem Fall mich ;) ) findet man anhand seines W2K-Logins durch:

Dim user As ActiveDs.IADsUser
Set user = GetObject(”WinNT://sternico.local/wm,user”)

Das ganze habe ich nun noch in ein Excel-Blatt eingebunden, so dass man bequem zum einen die Mitglieder einer Gruppe erhalten und zum anderen eine Liste von Logins auflösen kann. Da sich diese Seite als äußerst nützlich erwiesen hat und mir schon manchen Anruf bei der IT-Hotline unserer Kunden erspart hat, stelle ich sie auch gleich an dieser Stelle zur Verfügung:

ActiveDirectory2.xls (Jetzt auch mit Auflistung aller Gruppen zu einem Benutzer)

22 Antworten zu “Active Directory mit Excel auslesen”

  1. Andre sagt:

    Danke du hast meinen Tag gerettet

  2. Werner Mager sagt:

    :) Freut mich. Wenigstens ein kleiner Höhepunkt an einem Tag, an dem sonst irgendwie nix klappen will…

  3. beginner sagt:

    Das ist sehr hilfreich, vielen Dank!
    Wie immer, kommt der Appetit mit dem Essen.
    Ich möchte das VBA gerne erweitern, so dass es mir die Mail-Adressen zurückgibt. Ich habe bereits versucht, anstelle von user.FullName user.MailAddress auszuwählen, allerdings ohne Erfolg.
    Kann mir jemand auf die Sprünge helfen?
    Besten Dank schon jetzt.

  4. Werner Mager sagt:

    Die Email steht über den WinNT nicht zur Verfügung. Hier muß man statt dessen Ldap verwenden:

    Function GetEmail(login)
     
        Set rootDSE = GetObject("LDAP://rootDSE")
        Set Connection = CreateObject("ADODB.Connection")
        Connection.Provider = "ADsDSOObject"
        Connection.Open
     
        Set cmd = CreateObject("ADODB.Command")
        Set cmd.ActiveConnection = Connection
        cmd.CommandText = "SELECT mail FROM 'LDAP://" & rootDSE.Get("defaultNamingContext") & "' " & " WHERE objectCategory='person' AND sAMAccountName='" & login & "'"
     
        Set result = cmd.Execute
        If (Not (result.EOF)) Then
            If Not (IsNull(result.Fields("mail"))) Then
                Debug.Print (result.Fields("mail"))
                GetEmail = result.Fields("mail")
            End If
        End If
     
        result.Close
        Connection.Close
     
    End Function
  5. Werner Mager sagt:

    Und hier auch noch mal nen Link zu einer Seite, auf der die Felder im Ldap erläutert sind:
    http://www.computerperformance.co.uk/Logon/LDAP_attributes_active_directory.htm

  6. Anfänger sagt:

    Gefällt mir.

    Eine Frage zu der User Abfrage:
    Welche Änderung müsste man im script vornehmen wen man anstelle des Users (Login) den ‘DisplayName’ (z.B Mustermann, Max) als Suche eingeben möchte ? Also der umgekehrte weg.

    Danke.

  7. Werner Mager sagt:

    Also bei der Ldap-Variante müßte man nur das Query-Command anpassen. Z.B.:

     cmd.CommandText = "SELECT mail FROM 'LDAP://" & rootDSE.Get("defaultNamingContext") & "' " & " WHERE objectCategory='person' AND dn='" & displayName & "'"
  8. beginner sagt:

    Ich habe noch ein Excel Plugin gefunden, welches eigentlich alle Wünsche abdeckt. Es heisst ExcelLdapSearch und ist bei source forge zu finden. Damit durchsucht man vorwärts und rückwärts und da es OpenSource ist, kann und darf man auch selber noch Ergänzungen vornehmen. Ich habe damit alle Anforderungen abdecken können.
    Trotzdem herzlichen Dank für die tolle Unterstützung. Ich wünsche eine gute Zeit.

  9. Anfänger sagt:

    Supi, werde es bei Gelegenheit testen.

    Vielen Dank für eure Hilfe.

    MfG
    A

  10. Anfänger sagt:

    @beginner zu ExcelLdapSearch
    in welchem format hast Du die Parameter in der .ini eingetragen ?

    binddn=?
    bindpw=?
    basedn=?

    Danke.

  11. beginner sagt:

    @Anfänger

    ich habe es so eingetragen:

    bindn: AD-User
    bindpw: Passwort(AD-User)
    basedn=DC=ch,DC=xxxxxxx,DC=net (abhängig davon wie Dein AD aussieht)

    Gerne und viel Erfolg!

  12. Anfänger sagt:

    ok, das mit dem der basedn hatte ich auch schon so, aber es lag wohl an der fehlenden binddn und bindpw. Ich dachte es müsste auch ohne gehen, da es bei anderen ldab scripte die ich mal benutzt habe nie nötig war.

    vielen Dank.
    Grüße

  13. beginner sagt:

    Ja klar, wenn Du “andere” ldap scripte startest, z.B. aus dem CMD-Fenster, dann hat das CMD-Fenster deine Windows-(Domänen) Userrechte und erlaubt Dir auf das AD zuzugreifen. Kaum ein Admin erlaubt den anonymen Zugriff auf das AD…

    Gruss und schönen Nachmittag.

  14. Tester sagt:

    Genau das suche ich …
    Nur - ich benötige die Informationen zum Office und die Telefonnummer.
    Das muss ich doch nicht über LDAP machen, oder??

    Was muss ich dafür einsetzen?

    Danke!!

  15. twinc. sagt:

    Das interessiert mich auch brennend. Damit könnte ich mir das manuelle ziehen von Listen ersparen.

  16. Basto sagt:

    Danke, soweit sehr hilfreich, selbst für einen Neuling wie mich!
    Wie kann ich denn jetzt die Sicherheitsgruppen auslesen?

  17. Werner Mager sagt:

    Hallo Basto,
    gute Anregung :) Ich hab das mal eben noch eingebaut (siehe Donwload oben), die Gruppen zu einem Benutzer können werden nun auf dem dritten Tabellenblatt aufgelöst werden.
    Viel Spaß damit ;)

  18. Basto sagt:

    Das ging schnell! Danke Danke! Jetzt hab ich nur das Problem das er mir bei Ausführen sagt: “Fehler beim Kompilieren: Methode oder Datenobjekt nicht gefunden.” und verweist dabei auf das .GetInfo in grp.GetInfo.

    komische Sache, da es in einem anderem script von mir zum auslesen der User funktioniert. o.O

  19. Werner Mager sagt:

    Hmm, das ist wirklich komisch. Wobei der Aufruf nicht wirklich nötig ist, habe den Aufruf jetzt auch in der Datei rausgeworfen…

  20. Fahrradopa sagt:

    Ein hilfreiches Tool. Danke!
    In unserer AD sind die Gruppen verschachtelt. Da funktioniert das Auslesen (Auslesen der User bzw. der Untergruppen aus einer Gruppe) in den nächsten Ebenen nicht. Keine Ahnung, wie ich das Script umschreiben muss…

  21. _VBAAnfänger sagt:

    Super dieses Script !!

    Besteht die möglichkeit die Gruppen die mit “Distribution” gekenzeichnet sind auch auszulesen? würde diese Option gerne beim Benutzer noch hinzufügen.

    Bitte um Hilfe
    Danke

  22. Werner Mager sagt:

    Mit den Gruppentypen das ist nicht ganz einfach. Ich habe mal ein wenig getestet, bei einer Gruppe des Typs “Verteilung” hat das Script die Benutzer der Gruppe lesen können. Beim Suchen der Gruppen in denen der Benutzer Mitglied ist jedoch ist diese Gruppe nicht aufgetaucht.(@VBAAnfänger: ich denke mal das war es was du wolltest?)
    Ich werde dazu noch mal etwas probieren und das Excelblatt dann erweitern :)

Hinterlasse eine Antwort