'==================================================================================================
' NAME: PostfixAddressExtract.VBS
' VERSION: 1.0
' AUTHOR: Bharat Suneja (altered by Lee Monamy)
' LAST MODIFIED : 16/08/2007
'==================================================================================================
' COMMENT: Based on LISTPROXYADDRESSES.VBS/LISTEMAILADDRESSES.VBS by Bharat Suneja
' http://exchangepedia.com/blog/2005/09/how-to-export-all-email-addresses-from.html
' but altered to:
' o strip out cn, mail, etc entries
' o strip out .local addresses
' o remove a bunch of extra CRLFs
' o remove the "SMTP:" or "smtp:" prefix from addresses (x = Right(x), Len(x) -5))
' o put the display name commented out just before the email addresses
' o append " OK" after just the email address (sans SMTP: prefix)
' Run the script (double-click) and the output appears in a dialog. It is also written
' to C:\proxyaddresses.txt. You should be able to copy this file to your spam filter and
' simply postmap it with no further processing required.
' DISCLAIMER: THIS SCRIPT IS ENTIRELY UNSUPPORTED. USE AT YOUR OWN RISK. NOBODY BUT YOU
' IS RESPONSIBLE IF THIS SCRIPT DELETES THE CONTENTS OF YOUR ACTIVE DIRECTORY OR SETS FIRE
' TO YOUR CAT. CAVEAT EMPTOR.
' LICENCE: Unknown, as this is pretty much Bharat Suneja's script with minor changes, and
' there was no licence mentioned originally. Otherwise, LGPL. Do what you like.
' This has been tested on several SBS 2003 installations and Works For Me, and does what I
' need. I hope you find it useful.
' Thanks to Gary V (http://www200.pair.com/mecham/spam/) & freespamfilter.org for their
' truly excellent documentation!
'==================================================================================================
'Set up constant for deleting values from multivalued attribute memberOf
Const ADS_PROPERTY_NOT_FOUND = &h8000500D
Const ADS_UF_ACCOUNTDISABLE = 2 'For UserAccountControl
Const strX400Search = "x400"
Const LocSearch = ".local"
'______________________________________________________
'Set RootDSE
Set objRootDSE = GetObject("LDAP://rootDSE")
strDomain = objRootDSE.Get("defaultNamingContext")
strADPath = "LDAP://" & strDomain
'wscript.Echo strADPath
Set objDomain = GetObject(strADPath)
'wscript.echo "objDomain: " & objDomain.distinguishedName
'Setup ADODB connection
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
'Execute search command to look for Contacts & Groups
objCommand.CommandText = _
"<" & strADPath & ">" & ";(&(|(objectClass=contact)(objectClass=group))(mail=*))" & ";distinguishedName,displayName,mail,proxyAddresses;subtree"
'Execute search to get Recordset
Set objRecordSet = objCommand.Execute
'Start procedure
strResult = strResult & VbCrLf & "# Domain: " & strDomain
strResult = strResult & VbCrlf & "#Total Records Found (other accounts, distribution groups): " & objRecordSet.RecordCount & VbCrlf
AddressCount = 0
While Not objRecordSet.EOF 'Iterate through the search results
strUserDN = objRecordSet.Fields("distinguishedName") 'Get User's distinguished name from Recordset into a string
set objUser= GetObject("LDAP://"& strUserDN & "") 'Use string to bind to user object
arrProxyAddresses = objRecordSet.Fields("proxyAddresses")
If IsArray(objRecordSet.Fields("proxyAddresses")) Then
For Each ProxyAddress in arrProxyAddresses
'Sub: Check X400
If InStr(LCase(ProxyAddress), strX400Search) <> 0 Then
'Wscript.Echo "#This was an x400"
Else
If InStr(1, ProxyAddress, LocSearch, 1) = 0 Then
proxyAddress = Right(proxyAddress, Len(proxyAddress) -5 )
strResult = strResult & VbCrlf & proxyAddress & " OK"
End If
End If 'Ends loop for X400 address
Next
Else
strResult = strResult & VbCrlf & "#Object does not have proxy addresses"
End If
'strResult = strResult & VbCrLf
objRecordSet.MoveNext
Wend
'*************************************
'Begin second query for users
varDisabledCounter = 0
'Execute search command to look for user
objCommand.CommandText = _
"<" & strADPath & ">" & ";(&(objectClass=user)(mail=*))" & ";distinguishedName,displayName,mail,proxyAddresses;subtree"
'Execute search to get Recordset
Set objRecordSet = objCommand.Execute
strResult = strResult & vbCrlf & vbCrlf & "#Users"
strResult = strResult & VbCrlf & "#Total Records Found (users): " & objRecordSet.RecordCount
While Not objRecordSet.EOF 'Iterate through the search results
strUserDN = objRecordSet.Fields("distinguishedName") 'Get User's distinguished name from Recordset into a string
set objUser= GetObject("LDAP://"& strUserDN & "") 'Use string to bind to user object
If objUser.AccountDisabled = TRUE Then 'If User account disabled, then skip proxy address enum
varDisabledCounter = varDisabledCounter + 1
strResult2 = strResult2 & VbCrLf & "# " & varDisabledCounter & " " & objUser.displayName & VbCrLf
arrProxyAddresses = objRecordSet.Fields("proxyAddresses")
If IsArray(objRecordSet.Fields("proxyAddresses")) Then
For Each ProxyAddress in arrProxyAddresses
'Sub: Check X400
If InStr(LCase(ProxyAddress), strX400Search) <> 0 Then
'Wscript.Echo "#This was an x400"
Else
If InStr(1, ProxyAddress, LocSearch, 1) = 0 Then
proxyAddress = Right(proxyAddress, Len(proxyAddress) -5 )
strResult2 = strResult2 & "# " & proxyAddress & " OK"
End If
AddressCount = AddressCount + 1
End If 'Ends loop for X400 address
Next
Else
strResult2 = strResult2 & VbCrLf & "#Object does not have proxy addresses"
End If
'strResult2 = strResult2 & VbCrLf
Else
strResult = strResult & VbCrLf & "# " & " " & objUser.displayName
arrProxyAddresses = objRecordSet.Fields("proxyAddresses")
If IsArray(objRecordSet.Fields("proxyAddresses")) Then
For Each ProxyAddress in arrProxyAddresses
'Sub: Check X400
If InStr(LCase(ProxyAddress), strX400Search) <> 0 Then
'Wscript.Echo "#This was an x400"
Else
If InStr(1, ProxyAddress, LocSearch, 1) = 0 Then
proxyAddress = Right(proxyAddress, Len(proxyAddress) -5 )
strResult = strResult & vbCrlf & proxyAddress & " OK"
End If
AddressCount = AddressCount + 1
End If 'Ends loop for X400 address
Next
Else
strResult = strResult & VbCrLf & "#Object does not have proxy addresses"
End If
strResult = strResult & VbCrLf
End If 'End check for disabled user
objRecordSet.MoveNext
Wend 'End second query for users
strResult = "# Users, Groups & Contacts" & VbCrLf & "#-------------------------" & VbCrLf & strResult
strResult = strResult & VbCrLf & "# Disabled Users" & VbCrLf & "#-------------------------" & VbCrLf & strResult2
'WScript.Echo strResult
'Output to a text file
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objOutputFile = objFileSystem.CreateTextFile("C:\Inetpub\wwwroot\virtual.txt")
objOutputFile.Write strResult