2010-11-30 16 views
16

En mi código de Sharepoint que muestran una lista de todos los usuarios definidos a través de:miembros Obtención de un grupo de dominio de AD utilizando Sharepoint API

foreach (SPUser user in SPContext.Current.Web.AllUsers) 
{ 
    ... 
} 

La gran parte es que puede agregar un grupo de seguridad de dominio a un grupo de SharePoint (como Visitantes) agregando así muchos usuarios a la vez (administración más simple). Pero mi código no ve a esos usuarios al menos hasta que inicien sesión por primera vez (si tienen suficientes derechos). En este caso, solo puedo ver la instancia del objeto del grupo de seguridad de dominio SPUser con su IsDomainGroup establecido en true.

¿Es posible conseguir que los miembros de grupo de dominio por medio de Sharepoint sin recurrir a la consulta de Active Directory (que es algo que yo preferiría evitar, porque es probable que tenga derechos suficientes para hacer este tipo de operaciones = más la administración: los derechos de Sharepoint + AD derechos).

Respuesta

31

Puede usar el método SPUtility.GetPrincipalsInGroup (MSDN).

Todos los parámetros se explican por sí mismos, excepto string input, que es el nombre de la cuenta NT del grupo de seguridad:

bool reachedMaxCount; 
SPWeb web = SPContext.Current.Web; 
int limit = 100; 
string group = "Domain\\SecurityGroup"; 
SPPrincipalInfo[] users = SPUtility.GetPrincipalsInGroup(web, group, limit, out reachedMaxCount); 

Tenga en cuenta que este método no resuelve los grupos de seguridad anidadas. Además, se requiere que el usuario ejecutor tenga permiso de exploración de información de usuario (SPBasePermissions.BrowseUserInfo) en la web actual.

Actualización:

private void ResolveGroup(SPWeb w, string name, List<string> users) 
{ 
    foreach (SPPrincipalInfo i in SPUtility.GetPrincipalsInGroup(w, name, 100, out b)) 
    { 
     if (i.PrincipalType == SPPrincipalType.SecurityGroup) 
     { 
      ResolveGroup(w, i.LoginName, users); 
     } 
     else 
     { 
      users.Add(i.LoginName); 
     } 
    } 
} 

List<string> users = new List<string>(); 
foreach (SPUser user in SPContext.Current.Web.AllUsers) 
{ 
    if (user.IsDomainGroup) 
    { 
     ResolveGroup(SPContext.Current.Web, user.LoginName, users); 
    } 
    else 
    { 
     users.Add(user.LoginName); 
    } 
} 

Editar:

[...] recurriendo a la consulta de Active Directory (que es algo que yo preferiría evitar, porque es probable que tenga suficientes derechos hacer tales operaciones [...]

Eso es t rue, por supuesto, pero SharePoint tiene que buscar el AD también. Es por eso que se requiere que una cuenta de servicio de grupo de aplicaciones tenga acceso de lectura al AD. En otras palabras, debe ejecutar consultas de forma segura contra AD si ejecuta su código revertido a la cuenta de proceso.

+1

Ok. pero, ¿acapara los grupos anidados? Porque los miembros internos son también principales. –

+0

No, los grupos anidados no se resolverán. Si el rendimiento no es relevante, las llamadas recursivas a este método no deberían ser tan importantes. Los grupos anidados serán devueltos como información principal también. – Stefan

+0

Ok, si enumero 'SPContext.Current.Web.AllUsers' y llego a los grupos de dominio, ¿puedo usar ese nombre para usar con' GetPrincipalsInGroup'? No he probado, así que solo estoy haciendo una Q. –

6

Le sugiero que simplemente consulte Active Directory directamente. Está gastando mucho esfuerzo para que SharePoint haga esta llamada a AD por usted. Cada cuenta que tenga acceso de Usuario de Dominio debería poder consultar los grupos de AD que ha anidado en SharePoint. Solo iría a la fuente.

De esta manera no tiene que preocuparse por Examinar permisos de usuario o cualquier otra cosa. En mi opinión, tratar de proxy esto a través de SharePoint solo hace su vida más difícil.

+4

¿Te importa agregar algún código C# cómo hacerlo? Sé que puedo encontrarlo en la red, pero apoyar tu respuesta con algún código sería mejor. –

+1

Lo siento, todavía soy nuevo aquí. como si pudieras modificar esto fácilmente para implementar una solución robusta a tu problema. [link] (http://www.codeproject.com/KB/sharepoint/Sharepoint__User.aspx) –

+0

Linq to AD http: // linqto ad.codeplex.com/ – hidden

Cuestiones relacionadas