8

Tengo que rellenar mi autocompletar PeopleEditor como control basado en brililant ASPTokenInput con todas las personas de mi dominio AD. Reflejar PeopleEditor muestra un verdadero lío en su motor de búsqueda de Active Directory y todas las clases potencialmente útiles son internas.Obtener todos los usuarios del directorio activo en sharepoint

Mi método de prueba funciona bien, pero necesito para obtener todos los usuarios de anuncio (no sharepoint los sitios) para llenar mi lista: 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); 
    } 

¿Cómo puedo consultar el directorio activo de esta manera? ¿Es posible recuperar todas las configuraciones de conexión de AD desde Sharepoint? Solo necesito el id y el nombre de usuario para completar mi lista desplegable. Convertir esto a SPUserCollection es otra gran cosa.

Sería muy bueno para usar algunos métodos SP integradas como esto:

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

¿Por qué no utiliza el método 'SPUtility.SearchWindowsPrincipals'? – Stefan

Respuesta

1

La solución era simple, lo único que necesitaba era la implementación de búsqueda del Grupo SharePoint (si se especifica en el Control del Editor de Campo). SP tiene un buen método incorporado, así que lo uso.

/// <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 

    } 
0

puedo pensar en dos opciones aquí.

  1. Puede utilizar System.DirectoryServices y consultar a todos los usuarios de su Active Directory en su código C#.

  2. Puede configurar User Profile Sync para que su base de datos de usuarios de SharePoint esté actualizada.

Cuestiones relacionadas