'================================================================================================== ' 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://verchick.com/mecham/public_html/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(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(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(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:\proxyaddresses.txt") objOutputFile.Write strResult