Listar los grupos de un usuario de Active Directory en C#

Queremos hacer una aplicación para windows (o para la Web) en .NET donde debemos comprobar si un usuario pertenece o no a unos grupos determinados del dominio.  Esto nos sirve para saber si el usuario puede entrar en la aplicación y qué permisos tiene. Lo normal es que un grupo contenga a un usuario directamente, pero, ¿que sucede si un usuario no pertenece directamente a un grupo A, sino que pertenece a un grupo B que a su vez pertenece al grupo A?.

Para que funcione en todos los casos se debe buscar el aributo tokenGroups de la cuenta del usuario en el Directorio Activo. Este atributo contiene todos los SIDs de los grupos a los que pertenece el usuario directa o indirectamente.

Aquí pongo un ejemplo comentando de cómo se puede hacer:

9 comentarios en “Listar los grupos de un usuario de Active Directory en C#

  1. Sebastian

    Hola buenas, buen material, pero tengo una dura

    que se coloca en:
    («LDAP://» + Environment.GetEnvironmentVariable(«USERDOMAIN»));

    por ejemplo tengo usuarios que estan en el domino «Work», eso debo colocar? o la ip de mi servidor?

    «samAccountName=» + Environment.GetEnvironmentVariable(«USERNAME»);

    aqui va el nombre de un usurio?
    por que antes obtengo la cuenta y el nombre
    mfigueroa (cuenta) y luego obtengo el nombre «Manuel Figueroa»

    gracias

    Responder
    1. admin Autor

      Normalmente poniendo el nombre del dominio ya vale, aunque puedes poner el nombre de la máquina que controla el dominio o la ip de esta.

      El usuario deber ser el del dominio (el que introduce para entrar en su sesión).

      Responder
  2. maialen

    Hola;

    He copiado el codigo que pones para obtener los grupos pero tengo una pregunta. ¿Cuando llamo a esta función que obtengo todos los grupos que hay?

    Porque estoy depurando y me aparecen meta el usuario que meta siempre 18 grupos y hay usuarios que no están en todos los grupos.

    ¿Como puedo hacer que solo me diga los grupos en los que esta el usuario?

    Gracias

    Responder
    1. admin Autor

      ¿Puede ser que no hayas modificado esta línea: adsSearch.Filter = «samAccountName=» + Environment.GetEnvironmentVariable(«USERNAME»);? Tendría que ser adsSearch.Filter = «samAccountName=» + usuario;

      Responder
  3. Luis

    Tengo este código y funciona bien en mi local pero al publicarlo en mi servidor IIS siempre me retorna null alguna idea?

    Responder
      1. Alejandro

        La parte del sids:

        StringBuilder sids = new StringBuilder();
        sids.Append(«(|»);
        foreach (byte[] sid in usuario.Properties[«tokenGroups»])
        {
        sids.Append(«(objectSid=»);
        for (int indice = 0; indice < sid.Length; indice++)
        {
        sids.AppendFormat("\\{0}", sid[indice].ToString("X2"));
        }
        sids.AppendFormat(")");
        }
        sids.Append(")");

        Responder

Responder a admin Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *