sharepointsharepoint-2010active-directorypeoplepicker

Get all users from active directory to sharepoint


I have to populate my autocomplete PeopleEditor-like control based on brililant ASPTokenInput with all people from my AD domain. Reflecting PeopleEditor shows a real mess in their Active Directory search engine and all potentially helpful classes are internal.

My test method works fine, but I need to get ALL users from AD(not sharepoint site ones) to populate my list: How it looks

public string GetUsers(string filter)
    {
        var spWeb = SPContext.Current.Web;
        SPUserCollection allusers = spWeb.AllUsers;
        List<SPUser> users = allusers.Cast<SPUser>().ToList();
        var query = from spUser in users.Select(usr => new {id = usr.ID, name = usr.Name})
                        .Where(p => p.name.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) >= 0)
                    select new {id = spUser.id.ToString(), spUser.name};

        return new JavaScriptSerializer().Serialize(query);
    }

How can I query active directory like this? Is it possible to retrieve all AD connection settings from sharepoint itself? I need just id and user name to fill my dropdownlist Converting this to SPUserCollection is another big deal.

It would be great to use some built-in SP methods like this:

 [SubsetCallableExcludeMember(SubsetCallableExcludeMemberType.UnsupportedSPType)]
public static IList<SPPrincipalInfo> SearchWindowsPrincipals(SPWebApplication webApp, string input, SPPrincipalType scopes, int maxCount, out bool reachMaxCount)

Solution

  • Solution was simple, the only thing I needed was SharePoint Group search implementation (If specified in Field Editor Control). SP has a nice built-in method, so I use it.

    /// <summary>
    /// Provides searching for AD or SharePoint group if specified in field setting
    /// </summary>
    public static class ActiveDirectorySearchProvider
    {
        public static IList<SPPrincipalInfo> Search(string filter, string selectionGroup, string principalType)
        {
            var site = SPContext.Current.Site.WebApplication;
            bool reachmaxcount;
            var scope = SPUtils.GetSpPrincipalType(principalType);
    
            if (!String.IsNullOrEmpty(selectionGroup)) //search for users in SPGroup if present
            {
                var rawSPGroupList = SPUtility.GetPrincipalsInGroup(SPContext.Current.Web, selectionGroup, 100,
                                                               out reachmaxcount).ToList();
    
                string lowerFilter = filter.ToLowerInvariant();
    
                var filteredGroupList =
                    rawSPGroupList.Where(
                        pInfo =>
                        pInfo.LoginName.Substring(pInfo.LoginName.IndexOf('\\') + 1).StartsWith(lowerFilter) ||
                        pInfo.DisplayName.ToLowerInvariant().StartsWith(lowerFilter) ||
                        pInfo.DisplayName.ToLowerInvariant().Substring(pInfo.DisplayName.IndexOf(' ') + 1).StartsWith(
                            lowerFilter)).ToList();
    
                return filteredGroupList;
            }
    
           return SPUtility.SearchWindowsPrincipals(site, filter, scope, 100, out reachmaxcount); //Search in AD instead
    
        }