Monday, December 1, 2008

HOW TO: Export all email addresses from a domain


'=================================================================================================='' VBScript Source File '' NAME: LISTPROXYADDRESSES.VBS' VERSION: 0.9' AUTHOR: Bharat Suneja , Bharat Suneja' CREATE DATE : 5/06/2004' LAST MODIFIED : 9/23/2005'==================================================================================================' COMMENT: ' What does it exactly do?' - Queries Active Directory for Contacts & Groups' - Lists their email addresses' - Queries Users' - Lists enabled users' email addresses' - Lists disabled users' email addresses separately (was required for a certain project I did a long time back)' - Outputs to command line and also to a text file - c:\proxyaddresses.txt' - X.400 addresses are ignored
'==================================================================================================
'Set up constant for deleting values from multivalued attribute memberOf
Const ADS_PROPERTY_NOT_FOUND = &h8000500DConst ADS_UF_ACCOUNTDISABLE = 2 'For UserAccountControlConst strX400Search = "X400"'______________________________________________________
'Set RootDSESet objRootDSE = GetObject("LDAP://rootDSE")strDomain = objRootDSE.Get("defaultNamingContext")strADPath = "LDAP://" & strDomain'wscript.Echo strADPathSet objDomain = GetObject(strADPath)'wscript.echo "objDomain: " & objDomain.distinguishedName
'Setup ADODB connectionSet 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): " & 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
strResult = strResult & VbCrlf & "cn: " & objUser.cn strResult = strResult & VbCrlf & "mail: " & objUser.mail arrProxyAddresses = objRecordSet.Fields("proxyAddresses") If IsArray(objRecordSet.Fields("proxyAddresses")) Then strResult = strResult & VbCrLf & "Proxy Addresses" For Each ProxyAddress in arrProxyAddresses 'Sub: Check X400 If InStr(ProxyAddress, strX400Search) <> 0 Then 'Wscript.Echo "#This was an x400" Else strResult = strResult & VbCrlf & proxyAddress End If 'Ends loop for X400 address Next
Else strResult = strResult & VbCrlf & "#Object does not have proxy addresses" End If strResult = strResult & VbCrLf
objRecordSet.MoveNextWend
'*************************************'Begin second query for usersvarDisabledCounter = 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 & "#Users" strResult = strResult & VbCrlf & "#Total Records Found (users): " & objRecordSet.RecordCount & VbCrlf
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 strResult2 = strResult2 & "cn: " & objUser.cn strResult2 = strResult2 & VbCrlf & "mail: " & objUser.mail arrProxyAddresses = objRecordSet.Fields("proxyAddresses") If IsArray(objRecordSet.Fields("proxyAddresses")) Then strResult2 = strResult2 & VbCrLf & "Proxy Addresses" For Each ProxyAddress in arrProxyAddresses 'Sub: Check X400 If InStr(ProxyAddress, strX400Search) <> 0 Then 'Wscript.Echo "#This was an x400" Else strResult2 = strResult2 & VbCrlf & proxyAddress 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 & "cn: " & objUser.cn strResult = strResult & VbCrlf & "mail: " & objUser.mail arrProxyAddresses = objRecordSet.Fields("proxyAddresses") If IsArray(objRecordSet.Fields("proxyAddresses")) Then strResult = strResult & VbCrLf & "Proxy Addresses" For Each ProxyAddress in arrProxyAddresses 'Sub: Check X400 If InStr(ProxyAddress, strX400Search) <> 0 Then 'Wscript.Echo "#This was an x400" Else strResult = strResult & VbCrlf & proxyAddress 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 & strResultstrResult = strResult & VbCrLf & "Disabled Users" & VbCrLf & "-------------------------" & VbCrLf & strResult2WScript.Echo strResult
'Output to a text fileSet objFileSystem = CreateObject("Scripting.FileSystemObject")Set objOutputFile = objFileSystem.CreateTextFile("C:\proxyaddresses.txt")objOutputFile.Write strResult

No comments: