Archive

Posts Tagged ‘Active Directory’

Get all active directory users using .NET

November 25, 2009 Leave a comment

Few days back I had requirment for pulling all the active directory users and it into a list. I tried few nice codes from online help but they failed for pulling all the users from AD, also the users I expected from the LDAP query (Active Directory) were not right (seems my domain and ldap path wasn’t right at all).
So finally I did some R n D also taken help from Network Admin for right LDAP path and domain name ūüôā . After that everything started working well. Following is the code for same.

public DataTable GetActiveDirectoryUsers()
{ 
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† string ldapPath = ConfigurationManager.AppSettings[“LDAP”]; // e.g “LDAP://OU=ADSI,DC=ds,DC=microsoft,DC=com
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† string domainPath = ConfigurationManager.AppSettings[“DomainName”]; // not needed anymore¬†
            
                //Initiate directoryEntry object here by specifying the LDAP Path.
                DirectoryEntry directoryEntry = new DirectoryEntry(ldapName);
                // Create Directory Searcher object for firing search on the LDAP
                DirectorySearcher directorySearcher = new DirectorySearcher();
                           
                // no need to define the datacolumns for the datatable here as it is typed datatable
                DataRow newUsersRow;
                try
                {   // Set directorySearcher attributes here
                    directorySearcher.SearchRoot = directoryEntry;
                    directorySearcher.SearchScope = SearchScope.Subtree;
                    // Set The Fields/ColumnNames to be fetched
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“cn”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“name”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“givenName”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“sn”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“sAMAccountName”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“initials”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“l”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“co”);
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.PropertiesToLoad.Add(“mail”);
                    //define filter criteria for search here
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† directorySearcher.Filter = “(&(objectCategory=person)(objectClass=User)(givenname=*))”;
                    // Set the pagesize in order to get all records here
                    directorySearcher.PageSize = 1000;

                    // Fire the search query here and collect the results in SearchResultCollection object
                    SearchResultCollection resultCollection = directorySearcher.FindAll();

                        try
                        {
                            foreach (SearchResult result in resultCollection)
                            {
                                newUsersRow = activeDirectoryDT.NewUsersRow();
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† newUsersRow.UserID = –currentUserID;

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† if (!((result.Properties[“sAMAccountName”][0]).ToString().ToUpper().StartsWith(domainName + “\\”)))
                                {
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† newUsersRow.UserName = domainName + “\\” + (result.Properties[“sAMAccountName”][0]).ToString();
                                }
                                else
                                {
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† newUsersRow.UserName = (result.Properties[“sAMAccountName”][0]).ToString();
                                }

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† newUsersRow.AliasName = (result.Properties[“name”][0]).ToString();
                                try
                                {
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† newUsersRow.Email = (result.Properties[“mail”][0]).ToString();
                                }
                                catch
                                {
                                }
                                newUsersRow.groupid = 1;
                                newUsersRow.Active = false;
                                newUsersRow.CreatedBy = 0;
                                newUsersRow.CreatedDate = DateTime.Now;
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† newUsersRow.UserType = “EndUser”;
                                newUsersRow.UserTypeID = 3;

                                activeDirectoryDT.Rows.Add(newUsersRow);
                            }
                        }
                        catch (Exception ex)
                        {
                            // do something here
                        }
                    });
                }
                catch (Exception ex)
                {
                  // do something here
                 }
            }

            return activeDirectoryDT;               
        }

In the above code few things are very important to note:

  1. LDAP path e.g “LDAP://OU=ADSI,DC=ds,DC=microsoft,DC=com” its very precise path for getting right DOMAIN
  2. Search Root and Search Scope sequnce must be as above, also the they must be set before listing the field name/column names that you want to pull out
  3. The Search Filter must be set after listing the field name/column names that you want to pull out
  4. The Page Size  must be set after search filter is set
  5. The Page Size Property helps you to pull out all of the Users. If this is not set then you will not get all users. This property is very similar to the Paging property of gridview which allows us to implement paging of the pulled data (here it does internal paging of the users and then returns the final composite users list)

I hope this will be helpful for you ūüôā

Advertisements