kostenloser Webspace werbefrei: lima-city


Funktionen die AD Abfragen in VBA (Excel) vereinfachen...

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    timebase

    Kostenloser Webspace von timebase

    timebase hat kostenlosen Webspace.

    Hallo,
    ich steh grade vor dem "Problem" Einträge im Active Directory (Benutzer/Gruppen/Client angeben) übersichtlich in einer Tabelle darstellen soll.
    Sicher kann man sich die Mühe machen und diese einzelnd auszulesen und dann per Copy & Paste in eine Tabelle zu übertragen....
    Das würde aber 1. viel Arbeit bedeuten, und 2. müsste sie auch jedes mal von Hand wieder geändert werden wenn neue Benutzer / Rechner oder Gruppen dazu kommen.
    Meine Idee wäre da in VBA über dsninfo oder ldap die Objekte abzufragen und die Ergebnisse in eine Tabelle eintragen zu lassen.

    Bevor ich mir hier Stunden um die Ohren haue und immer wieder an der dsinfo oder ldap Syntax verzweifel und ich sicher nicht der erste bin, der vor diesem Problem steht.
    Hat schon jemand fertige VBA Funktionen, die man in seinem VBA Projekt unterbringen kann, die diese Aufgabe lösen?
    Vielleicht gibts ja auch noch elegantere Wege als ldab oder dsinfo.
    Ich meine man muß ja nicht das Rad zum 100. mal neu erfinden.:wink:
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Autor dieses Themas

    timebase

    Kostenloser Webspace von timebase

    timebase hat kostenlosen Webspace.

    Danke,
    das sieht genau nach dem aus, was ich suchte, werde es im laufe der Woche ausprobieren.
    Schönen (Rest)Sonntag
  4. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Nun solltest du wieder posten können :thumb:
  5. Autor dieses Themas

    timebase

    Kostenloser Webspace von timebase

    timebase hat kostenlosen Webspace.

    Danke.
    meine Lösung zur Zeit sieht nun auszugsweise so aus ,
    Ausgangssituation :
    In Spalte E stehen die Namen im Format Nachname,Vorname
    Zeile gibt die erste freie Zeile an.

    For f = 2 To Zeile - 1
            kname = Sheets("Tabelle1").Range("e" & CStr(f)).Text
            team = ""
            If kname <> "" Then
                sp = InStr(kname, ", ")
                If sp <> 0 Then
                     Dim qQuery As String
    	' den Vor und Nachnamen aus der Tabelle holen                
    	NName = Left$(kname, sp - 1)
                    Vname = Right$(kname, Len(kname) - sp - 1)
    		 
                    ' Active Directory Informationen für den angemeldeten User lesen
                    Set objSysInfo = CreateObject("ADSystemInfo")
                    objSysInfo.RefreshSchemaCache
                    qQuery = "LDAP://CN=" & NName & "\, " & Vname & ",OU=Benutzer),DC=Mydom,DC=local"
    '                Sheets("Tabelle1").Range("A1").FormulaR1C1 = qQuery
                    On Error Resume Next
                    Set objUser = GetObject(qQuery)
                    'Variablen mit AD-Attributen füllen (es gibt viel mehr Attributen zb. FaxNumber usv.)
                    FullName = objUser.FirstName & " " & objUser.lastname
                    EMail = objUser.mail
                    team = objUser.department
                    Description = objUser.Description
                    PhoneNumber = objUser.telephoneNumber
                    Sheets("Tabelle1").Range("f" & CStr(f)).Value = Description
                    Sheets("Tabelle1").Range("C" & CStr(f)).Value = team
                    FaxNumber = objUser.facsimileTelephoneNumber
                    objUser.department = ""
                    objUser.Description = ""
                    objUser.FirstName = ""
                    objUser.FirstName = ""
                
                End If
            End If
        If team <> "" Then
        Sheets("Tabelle1").Range("c" & CStr(f)).Value = team
        End If
    Next f

    soweit so gut... er findet auch alle Mitglieder die genau in der OU Benutzer sind
    nur nicht wenn sich der Benutzer in der OU in einer weiteren "UnterOU" befindet.
    Muß ich für jede Mögliche OU in der der Benutzer sein kann eine eigene Abfrage schreiben, oder ist es möglich die Abfrage
    Generell alle OUs durchsuchen zu lassen?

    Beitrag zuletzt geändert: 4.9.2012 10:12:55 von timebase
  6. Hallo timebase,

    hast Du mal versucht den 'OU=Benutzer'-Teil einfach wegzulassen?

    Edit: Welche Bedeutung hat eigentlich die geschlossene runde Klammer nach 'OU=Benutzer'?

    Beitrag zuletzt geändert: 4.9.2012 12:44:21 von darkpandemic
  7. Autor dieses Themas

    timebase

    Kostenloser Webspace von timebase

    timebase hat kostenlosen Webspace.

    Weg lassen der "OU=" macht die Abfrage noch "blinder"
    Die Klammer ist tatsächlich da falsch am Platz.... sorry

    Ich hab zwischenzeitlich etwas anderes gefunden, was zu klappen scheint (allerdings nicht das schnellste ist.

    http://www.herber.de/forum/archiv/916to920/t918264.htm

    und für meine Zwecke daraus eine Funktion gebastelt.
    :
    Function GetOuUser(sUser)
        Dim oWSHShell As Object
        Dim dom As String, sADDomain As String
        Dim ouser As String, mail As String
        On Error Resume Next
        Set oWSHShell = CreateObject("Wscript.Shell")
        sADDomain = "MyDom"
        ouser = funcADUserLookup("distinguishedName", sUser, sADDomain)
        GetOuUser = ouser
        Set oWSHShell = Nothing
    End Function
    
    Function funcADUserLookup(ad_field, sSearch, sADDomain)
    Dim objConn As Object, objCommand As Object, objRS As Object
    Dim strSQL As Variant
        On Error Resume Next
        Set objConn = CreateObject("ADODB.Connection")
        objConn.Provider = "ADsDSOObject"
        objConn.Open "Active Directory Provider"
        Set objCommand = CreateObject("ADODB.Command")
        objCommand.ActiveConnection = objConn
        strSQL = "SELECT " & ad_field & " FROM 'LDAP://" & sADDomain & "' WHERE samaccountname = '" _
    & _
    sSearch & "'"
        objCommand.CommandText = strSQL
        Set objRS = objCommand.Execute
        funcADUserLookup = objRS.Fields(ad_field).Value
        
        Set objConn = Nothing
        Set objCommand = Nothing
        Set objRS = Nothing
    End Function

    die Funktion GetOuUser liefert mir genau den LDAP String mit allen OUs und DC einträgen den ich für meine Abfrage benötige
    Da der Benutzername 6 Buchstaben des Nachnamens sind und 2 des Vornames
    sieht das bei mit dann so aus:
    ...
                    NName = Left$(kname, sp - 1)
                    vname = Right$(kname, Len(kname) - sp - 1)
                    If Len(NName) > 6 Then
                        UName = Left$(NName, 6) & Left$(vname, 2)
                    Else
                        UName = NName & Left$(vname, 2)
                    End If
                    ldp = GetOuUser(UName)
                    ' Active Directory Informationen für den angemeldeten User lesen
                    Set objSysInfo = CreateObject("ADSystemInfo")
                    objSysInfo.RefreshSchemaCache
                    qQuery = "LDAP://" & ldp
    ...

    funktioniert nun bis auf User die ein "Von" oder ein "El" vor dem Nachnamen stehen haben, also wäre da noch eine Anpassung
    durch Ausfiltern von Leerzeichen nötig, das ist aber erst mal nicht so wild.
    Dass die Funktion etwas träge ist lässt sich sicher noch optimieren, allerdings wenn es reicht dass ich die Daten ein mal in der Woche zur verfügung stellen muß dann darfs auch was langsamer laufen.
    Nochmals Vielen Dank für deine Hilfe

  8. hatte letzens ein ähnliches problem, mit http://www.php.net/manual/de/ref.ldap.php habe ich nun ein schönes tool gebaut.
    dies ist aber bestimmt in allen möglichen programmiersprachen möglich, praktisch ist das webinterface, da dies in unserer firma überall super zugänglich ist und die resourcen zur verfügung standen.

    das dies von hand nicht machbar ist kann ich verstehen :D hatte zuerst ein XML (20.000 zeilen) export den ich auch via php in eine exel tabelle convertiert habe.... dies ging einfach mit http://www.php.net/manual/en/book.simplexml.php wobei wie gesagt php kentnisse vorlagen...

    dazu muss ich evt noch sagen das der ldap export in xml sehr seltsame zeichen enthielt, so das ich alles durch eine kleine regex schleife laufen lassen musste und anschließend das ganze als xml string ( auch bei simplexml dabei ) laden musste... der rest hat dann super funktioniert
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!