usuarios - query active directory c#




Leer grupos de autorización de usuarios de Active Directory (2)

En nuestro sistema, estamos leyendo grupos de seguridad de usuarios de un Directorio Activo de dos maneras diferentes. En un caso, la lista de grupos devueltos por AD pierde los grupos locales de dominio. La respuesta de GetAuthorizationGroups () depende del PrincipalContext utilizado. En los escenarios con errores, GetAuthorizationGroups () solo devolverá grupos globales. Al resultado le faltan todos los grupos locales de dominio de AD. ¿Alguien puede explicar por qué?

Falla de solución:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

En este caso, el proceso es ejecutado por "Usuario A". "UserA" es un miembro del dominio "our.domain.net". "Usuario A" es el mismo usuario que el usuario identificado específicamente en la solución de trabajo. El PrincipalContext debería ser idéntico al PrincipalContext en la solución de trabajo. La respuesta de GetAuthorizationGroups () en esta solución pierde los grupos locales de dominio de AD.

Solución de trabajo:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net", "UserA", "PasswordA");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

En este caso, el usuario llamante se identifica específicamente por nombre de uso y contraseña al crear el contexto principal. En este caso, el AD devuelve todos los grupos de los que el usuario es miembro. Este es el comportamiento que me gustaría ver también de la solución que falla. En algunos casos, no tengo la contraseña de usuario de UserA y, por ese motivo, la solución de trabajo no es una opción.

Ayúdeme a comprender por qué la solución que falla no devuelve todos los grupos de los que el usuario es miembro.


Finalmente encontramos el problema. Resultó ser un problema de codificación. El extraño comportamiento fue causado por un erróneo Nivel de dominio en el Directorio Activo.

El nivel de dominio debe establecerse en "nivel funcional 2003"

Ahora todo funciona como se esperaba.


"Extraña los grupos locales de dominio de la AD" porque probablemente está iterando los groups resultantes con el bucle foreach y está obteniendo la excepción NoMatchingPrincipalException para uno de los grupos que el usuario no tiene acceso de lectura y en ese punto deja de iterar, no logra obtener el resto de los grupos.

Como solución, puede usar el siguiente iterador (el código detrás de la estructura foreach ) para obtener el resto de los grupos:

var enumerator = groups.GetEnumerator();                
while (enumerator.MoveNext())
{
    try
    {
        var e = enumerator.Current;
        listView1.Items.Add(e.Name);
    }
    catch (NoMatchingPrincipalException)
    {
    }
}






active-directory