Die Mailadressen einer Exchange-Organisation sind im Active Directory gespeichert. Für den Zugriff auf die Hauptadresse eines Benutzers gibt es ein einfach auszuwertendes Feld im AD: "mail" bzw. "E-Mail-Adresse". Nur: Viele Objekte haben mehr als eine Adresse - diese stehen dann im Feld "proxyAddresses" bzw. "E-Mail-Adresse (andere)". Da dieses Feld mehrwertig (multi-valued) ist, kann es über die AD-Verwaltungskonsole leider nicht ohne weiteres durchsucht werden. Noch dazu gibt es zahlreiche weitere Objektklassen, die Mailadressen haben können.
Mit Hilfe eines VB-Skripts lassen sich alle Mailadressen ausgeben, die im AD bekannt sind. Es fragt alle Objekte ab, die einen Exchange-Alias haben und liest von diesen die "proxyAddresses" aus. Diese wiederum stellt es in einer Tabelle übersichtlich dar - momentan geordnet nach der Mailadresse; in einer späteren Version wird man die Sortierung ändern können.
Dies ist die korrigierte Fassung: Sie funktioniert ab sofort in jeder Domäne, nicht nur bei mir in der Firma. ,-) Voraussetzung ist, dass der aufrufende Rechner Domänenmitglied ist.
Achtung: Das Skript ist u.U. für sehr große Datenbestände nicht geeignet, weil es den Internet Explorer zur Ausgabe nutzt. In solchen Fällen können die Daten z.B. in eine Datei ausgegeben werden.
Wer gezielt nach einer bestimmten Adresse sucht, kann diesen Artikel nutzen.
Einen ähnlichen Ansatz in anderer Ausprägung beschreibt Frank Carius hier.
""""""""""""""""""""""""""'
' AD-Mailadressen_anzeigen.vbs
' Beschreibung
'
' Version: 1.1a
' Datum: 21.04.2005/23.08.2005
' Autor: Nils Kaczenski (Vorname at Nachname .de)
' Letzte Änderungen:
'
' Nils Kaczenski stellt dieses Skript ohne jede
' Gewährleistung zur Verfügung.
' Die Verwendung geschieht auf eigene Gefahr.
'
""""""""""""""""""""""""""'
Option Explicit
Dim strMail '
Dim arrMember '
Dim arrObjectClass '
Dim arrProxyAddresses '
Dim i '
Dim objConn '
Dim objExplorer '
Dim objRSAD '
Dim objRSlokal '
Dim strAusgabe '
Dim strConn '
Dim strMember '
Dim strObjectClass '
Dim strSQL '
Dim objRoot
Dim strDomain
Set objConn = CreateObject("ADODB.Connection")
Set objRSlokal = CreateObject("ADODB.Recordset")set objRoot = GetObject("LDAP://rootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
strConn = "Provider=ADsDSOObject;"
objConn.Open strConn
' Zugriff auf die gesamte Tabelle
strSQL = "SELECT name,mailNickname,mail,proxyAddresses,member,objectClass " _
& "FROM 'LDAP://" & strDomain & "' WHERE mailNickname='*'"
Set objRSAD = objConn.Execute(strSQL)
objRSlokal.Fields.Append "Mailadresse", 202, 255
objRSlokal.Fields.Append "Name", 202, 255
objRSlokal.Fields.Append "Alias", 202, 255
objRSlokal.Fields.Append "Typ", 202, 255
objRSlokal.Fields.Append "Mitglieder", 202, 16384
Do Until objRSAD.EOF
arrProxyAddresses = objRSAD("proxyAddresses")
strMail = objRSAD("mail")
If Not IsNull(objRSAD("member")) Then
arrMember = objRSAD("member")
strMember = Join(arrMember, "<br>")
Else
strMember = ""
End If
arrObjectClass = objRSAD("objectClass")
strObjectClass = arrObjectClass(UBound(arrObjectClass))
For i=0 To UBound(arrProxyAddresses)
If LCase(Left(arrProxyAddresses(i),5)) = "smtp:" Then
' Neuen Datensatz lokal einfügen
objRSlokal.AddNew
objRSlokal("Name") = objRSAD("name")
objRSlokal("Alias") = objRSAD("mailNickname")
objRSlokal("Typ") = strObjectClass
objRSlokal("Mailadresse") = Mid(arrProxyAddresses(i),6)
objRSlokal("Mitglieder") = strMember
objRSlokal.Update
End If
Next
objRSAD.MoveNext
Loop
objRSlokal.Sort="Mailadresse"
objRSlokal.MoveFirst
strAusgabe = objRSlokal.GetString(2, -1, "</TD><TD>", "</TD></TR>" _
& vbCrLf & "<TR><TD>", " ")
strAusgabe = "<HTML><BODY style=""font-family:sans-serif;"">" _
& "<TABLE border=""1""><TR><TD>" _
& strAusgabe & "</TD></TR></TABLE></BODY></HTML>"


27. April 2005, 14:41 Uhr 
