Funktionen die AD Abfragen in VBA (Excel) vereinfachen...
lima-city → Forum → Programmiersprachen → Basic
abfrage
benutzer
code
dank
export
funktion
gruppe
hand
http
nachname
problem
rang
set
stehen
string
tabelle
team
url
woche
zeile
-
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.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo timebase,
hier findest Du Beispielcode (Posting Nr. 9):
http://www.dbforums.com/microsoft-access/1618143-retrieving-active-directory-contents-vba.html
und hier (Posting Nr. 3)
http://www.mrexcel.com/forum/excel-questions/553062-using-excel-visual-basic-applications-query-active-directory.html -
Nun solltest du wieder posten können
-
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 -
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 -
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
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage