' ' filename: aduserlist.vbs ' version: 1.03 ' last change: 2009 Oct 20 ' ' Retrieve Users, Distributions list and Aliases from the Active Directory ' Output can be used by the "mass user creation" form of emailgency ( http://www.emailgency.com ) ' ' author: Alain Spineux alain.spineux@gmail.com ' ' ' YOU HAVE TO SETUP your PERSONAL DATA below ' Dim eg_domains ' This is the list of your main domain name followed by your domain aliases if any eg_domains=Array("mydomain.com", "mydomainalias.com", "anotherdomainalias.com") ' This is the name of the group you have defined in your AD to filter your user and distribution list eg_group="emailgency users" '===== DONT CHANGE ANYTHING AFTER THIS LINE ================================== '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" '______________________________________________________ Function norm_addr(addr) addr=LCase(addr) pos=InStrRev(addr, "@") norm_addr="" If pos <> 0 Then domain_name=Right(addr, Len(addr)-pos) user_name=Left(addr, pos-1) For Each domain in eg_domains: If domain = domain_name Then norm_addr=user_name & "@" & eg_domains(0) End If Next End If 'wscript.Echo addr & " -> " & norm_addr End Function '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 Set eg_members = CreateObject("Scripting.Dictionary") eg_filter=False 'Execute search command to look for the eg_group and members objCommand.CommandText = "<" & strADPath & ">" & ";(&(objectClass=group)(name=" & eg_group & "))" & ";distinguishedName,name,member;subtree" 'Execute search to get Recordset Set objRecordSet = objCommand.Execute 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 Wscript.Echo strUserDN Wscript.Echo objUser.cn Wscript.Echo objUser.displayName arrMembers = objRecordSet.Fields("member") If IsArray(objRecordSet.Fields("member")) Then For Each member in arrMembers set objMember= GetObject("LDAP://"& member & "") member=norm_addr(objMember.mail) Wscript.Echo member eg_members.add member, 0 eg_filter=True Next End If objRecordSet.MoveNext Wend 'Wscript.quit() '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 user_total=objRecordSet.RecordCount user_count=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 mail=norm_addr(objUser.mail) If objUser.AccountDisabled = True Then If eg_members.exists(mail) Then eg_members.Remove(mail) End If Else 'Wscript.Echo strUserDN 'strResult = strResult & VbCrlf & "#dn: " & strUserDN 'strResult = strResult & VbCrlf & "#cn: " & objUser.cn If mail <> "" AND (NOT eg_filter OR eg_members.exists(mail)) Then eg_members.item(mail)=1 strResult = strResult & mail arrProxyAddresses = objRecordSet.Fields("proxyAddresses") user_count = user_count + 1 If IsArray(objRecordSet.Fields("proxyAddresses")) Then Set aliases = CreateObject("Scripting.Dictionary") For Each ProxyAddress in arrProxyAddresses 'Sub: Check X400 If InStr(ProxyAddress, strX400Search) <> 0 Then 'Wscript.Echo "#This was an x400" Else ProxyAddress=LCase(ProxyAddress) If Left(ProxyAddress, 5) = "smtp:" Then ProxyAddress=Right(ProxyAddress, Len(ProxyAddress)-5) End If alias=norm_addr(ProxyAddress) If alias <> "" AND alias <> mail AND NOT aliases.exists(alias) Then aliases.add alias, 0 strResult = strResult & " " & alias 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 End If End If 'End check for disabled user objRecordSet.MoveNext Wend 'End query for users 'Execute search command to look for Groups (distrtibution list) objCommand.CommandText = "<" & strADPath & ">" & ";(&(objectClass=group)(mail=*))" & ";distinguishedName,displayName,mail,proxyAddresses,member;subtree" 'Execute search to get Recordset Set objRecordSet = objCommand.Execute 'Start procedure distlist_total = objRecordSet.RecordCount distlist_count = 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 ' objUser.cn ' objUser.mail 'strResult = strResult & VbCrlf & "#dn:" & strUserDN 'strResult = strResult & VbCrlf & "#cn:" & objUser.cn 'Wscript.Echo strUserDN mail=norm_addr(objRecordSet.Fields("mail")) If mail <> "" AND (NOT eg_filter OR eg_members.exists(mail)) Then strResult = strResult & "<" & mail arrProxyAddresses = objRecordSet.Fields("proxyAddresses") distlist_count = distlist_count + 1 If IsArray(objRecordSet.Fields("proxyAddresses")) Then Set aliases = CreateObject("Scripting.Dictionary") For Each ProxyAddress in arrProxyAddresses 'Sub: Check X400 If InStr(ProxyAddress, strX400Search) <> 0 Then 'Wscript.Echo "#This was an x400" Else ProxyAddress=LCase(ProxyAddress) If Left(ProxyAddress, 5) = "smtp:" Then ProxyAddress=Right(ProxyAddress, Len(ProxyAddress)-5) End If alias=norm_addr(ProxyAddress) If alias <> "" AND alias <> mail AND NOT aliases.exists(alias) Then aliases.add alias, 0 strResult = strResult & " " & alias End If End If 'Ends loop for X400 address Next Else 'strResult = strResult & VbCrlf & "#Object does not have proxy addresses" End If strResult = strResult & ">" arrMembers = objRecordSet.Fields("member") If IsArray(objRecordSet.Fields("member")) Then For Each member in arrMembers set objMember= GetObject("LDAP://"& member & "") member=norm_addr(objMember.mail) If member <> "" AND eg_members.exists(member) Then strResult = strResult & " " & member End If Next End If strResult = strResult & VbCrLf End If objRecordSet.MoveNext Wend summary="# user: " & user_count & " / " & user_total & VbCrLf & _ "# dist list: " & distlist_count & " / " & distlist_total strResult=summary & VbCrLf & VbCrLf & strResult '************************************* 'Begin second query for users varDisabledCounter = 0 WScript.Echo summary 'Output to a text file Set objFileSystem = CreateObject("Scripting.FileSystemObject") Set objOutputFile = objFileSystem.CreateTextFile("proxyaddresses.txt") objOutputFile.Write strResult