Getting Email List from Windows Domain

David C.M. Weber david.weber at BACKBONESECURITY.COM
Fri Feb 25 16:13:47 GMT 2005


I can also attach the files to someone if they'd rather have those.
*stupid 80 char limitations*



-----Original Message-----
From: MailScanner mailing list [mailto:MAILSCANNER at JISCMAIL.AC.UK] On
Behalf Of David C.M. Weber
Sent: Friday, February 25, 2005 10:20 AM
To: MAILSCANNER at JISCMAIL.AC.UK
Subject: Re: Getting Email List from Windows Domain


A day late, but I had problems w/ my configuration.

On the windows side, I have an ASP script which I installed on my
Exchange box, and made a virtual IIS directory.  I named the file,
default.asp.  Here are the contents:

---------Start File--------------
<%
' Written by David CM Weber (rotinom at gmail dot com)
' This code is freely distributable
'
' This script (when used with the appropriate client portion) will allow
a 
' sendmail/Linux box to retrieve all valid email addresses within an
Exchange
' organization.  It will then place them into a format appropriate for
sendmail
' to use as an access list

' Start of the "main" function

        ' All this does, is essentially access the Active Directory via
LDAP, and get
        ' a handle to the tree, so that objects can be examined and
iterated through.
        Dim rootDSE, domainObject
        Set rootDSE = GetObject("LDAP://RootDSE")
        domainContainer = rootDSE.Get("defaultNamingContext")
        Set domainObject = GetObject("LDAP://" & domainContainer)
	
        ' Export the users
        ExportEmail(domainObject)

' End of the "main" function


' This is the guts of the whole program. This will recursively 
' search the entire active directory tree, and print out emails
' which are associated with either user objects, or group objects

' oObject will either be an Organizational Unit (OU) or a Container
Sub ExportEmail(oObject)
        Dim oUser
	
        ' iterate through each sub-object in this object
        For Each oUser in oObject
                Select Case oUser.Class
        	
                        ' Is it a user object?
                        Case "user"
                	
                                ' Just verify that it is a user w/ an
email box
                                If oUser.mail <> "" then

                                        for each email in
oUser.proxyAddresses 
                                                print_email(email)
                                        next            	
                                End if 
                	
                        'Is it a group object?
                        Case "group"
                	
                                ' Verify whether it is a mail-enabled
group
                                If oUser.mailNickname <> "" then

                                        for each email in
oUser.proxyAddresses 
                                                print_email(email)
                                        next            	
                                End if
                	
                        ' If it is an OU or a container
                        Case "organizationalUnit" , "container"
                                ' Check to see if there are any users or
groups in the 
                                ' container
                                If UsersGroupsinOU (oUser) then 
                                        ' Call the ExportEmail function
recursively
                                        ExportEmail(oUser)
                                End if 
                End select
        Next
End Sub

' This function will print out an email address stored in an objects
"proxyAddresses" fields
Function print_email(email)
        ' We are only interested in SMTP email addresses. Not X400,
MSMail, etc.  
        ' So, we only parse the SMTP addresses
        if Instr(email, "SMTP:") <> 0  or Instr(email, "smtp:") <> 0
then
                dim n, e
                ' locate the ":"
                n = InStr(1, email, ":", 1)
        	
                ' Cut off everything to the right of the ":"
                e = Right(email, Len(email) - n)	
        	
                'Write the results to the HTML document.  The format is:
                ' email at address.com <tab> <tab> ACCEPT <LF>
                ' in an attempt to make it semi-legible.
                response.write("To:" & e & Chr(9) & Chr(9) & "RELAY" &
Chr(10))                        	
        end if
end function


' This function determines whether there is an object of interest within
a 
' container/OU object.  Objects of interest are:
'       OU's
'       Containers
'       Groups
'       Users
'
' OU's and Groups will cause a recursive call to the function, whereas a

' group or user will simply return an affirmative (true) result.
Function UsersGroupsinOU (oObject)
        Dim oUser
        UsersGroupsinOU = False
        for Each oUser in oObject 
                Select Case oUser.Class
                        Case "organizationalUnit" , "container"
                                UsersGroupsinOU = UsersGroupsinOU(oUser)
                        Case "user"
                                UsersGroupsinOU = True
                        Case "group"
                                UsersGroupsinOU = True
                End select
        Next
End Function

%>

----------End File--------------

This works with a linux bash script, which pulls this information down,
and formats it the way that the access file requires it.  It uses a
"access_header" file, to prepend any static information to the beginning
(such as the contents of your existing access file).  I set up a cron
job to run this script every 15 minutes.  See the defines at the
beginning of the script for any requirements that you may have.


-------Begin Linux Script------------

#gen_email.sh
#
# Written by David CM Weber (rotinom at gmail dot com)
# This code is freely distributable
#
# This will generate an access file based on email addresses
# found on an exchange "back end" server.
#
# Please see the companion script for the exchange
# server portion.


# The location of the companion asp script (on some windows domain
controller)
email_http_location="https://exchange_server_name/EmailList/default.asp"

# the name of the file that you are downloading
dl_filename="/etc/mail/update/default.asp"

# the name of the "old" file that you wish to use (for caching of email
addresses)
dl_filename_old="/etc/mail/update/default.asp.old"

# Location of the access file (usually /etc/mail/access)
access_file="/etc/mail/access"

# location of the access.db file (usually /etc/mail/access/access.db)
access_db="/etc/mail/access.db"

# Location of the old "real" access file.  Use this to add manual
"blacklists"
# and to make otherwise static changes to the access file
access_header="/etc/mail/access_header"

# Warning to put at the top of the created access file
header_warning="#*** WARNING! DO NOT EDIT THIS FILE DIRECTLY!
***\n#Instead, edit $access_header to make your changes\n\n\n"

# Separator to place between the static & dynamic content of the access
file
separator="\n\n# --- BEGIN ADDRESSES AUTOMATICALLY GATHERED FROM
EXCHANGE SERVER ---"


# ------------ Begin Script --------------

# Retrieve the asp results
wget -O $dl_filename $email_http_location &> /dev/null

# compare the old & new email list
cmp $dl_filename $dl_filename_old  &> /dev/null

if [ $? -eq 0 ]         # Test exit status of "cmp" command.
then
  # No changes to the email file
  exit
else
  # General note: > overwrites a current or createsa new file,
  # and >> appends an existing one

  # Insert the warning text
  echo -e $header_warning > $access_file

  # Insert the static content
  cat $access_header >> $access_file

  # Insert the separator
  echo -e $separator >> $access_file

  # Insert the dynamic content
  cat $dl_filename >> $access_file

  # Move the new content over the old content
  mv -f $dl_filename $dl_filename_old &> /dev/null

  # Create the access.db file based on the access file
  makemap hash $access_db < $access_file
Fi

----------End Linux Script---------------------

------------------------ MailScanner list ------------------------
To unsubscribe, email jiscmail at jiscmail.ac.uk with the words:
'leave mailscanner' in the body of the email.
Before posting, read the MAQ (http://www.mailscanner.biz/maq/) and
the archives (http://www.jiscmail.ac.uk/lists/mailscanner.html).

Support MailScanner development - buy the book off the website!

------------------------ MailScanner list ------------------------
To unsubscribe, email jiscmail at jiscmail.ac.uk with the words:
'leave mailscanner' in the body of the email.
Before posting, read the MAQ (http://www.mailscanner.biz/maq/) and
the archives (http://www.jiscmail.ac.uk/lists/mailscanner.html).

Support MailScanner development - buy the book off the website!




More information about the MailScanner mailing list