2008-09-25 33 views
10

Tengo una aplicación web que se ejecuta en la Autenticación de Windows utilizando nuestro Directorio Activo. Tengo un nuevo requisito para extraer información personal a través de la entrada de Active Directory. ¿Cuál sería la forma más fácil de acceder a esta información?Active Directory: Recuperar información del usuario

Respuesta

17

Acceso al usuario directamente a través de un DirectoryEntry parece que el enfoque más directo. Aquí hay algunos datos relacionados con AD que aprendí de mi primer proyecto relacionado con AD:

  • En un URI, escriba LDAP en minúsculas. De lo contrario, obtendrá un error misterioso. Pasé más de un día en este tema deprimente ...
  • Para borrar una propiedad de un solo valor, configúrelo en una cadena vacía, no nula. Null causa una excepción.
  • Para borrar una propiedad con múltiples valores, use el método DirectoryEntry.Property.Clear().
  • La referencia de esquema de Active Directory indicará qué tipo de datos será un valor y si tiene valor múltiple o valor único.
  • No necesita actualizar RefreshCache() manualmente en un Director de sitio pero si alguna vez lo usa y especifica qué propiedades va a almacenar en caché, sepa que no recuperará automáticamente otras propiedades en el futuro.
  • Una COMException se puede ejecutar en cualquier momento que utilice las clases en System.DirectoryServices. Mantenga un ojo en esos bloques de prueba. No asumas que nada es seguro.

Probablemente necesite utilizar DirectorySearcher para obtener la entrada del directorio de su usuario si no conoce su ruta (que no lo haría, simplemente por tenerlo conectado). Usarlo fue bastante fácil, pero ten cuidado con las peculiaridades de la sintaxis de LDAP; a saber, tener que codificar caracteres que no sean ASCII (¿y otros?). La cadena de búsqueda que usaría probablemente sería algo así como: (& (sAMAccountName = whatever) (clase = usuario)). Esto está fuera de mi cabeza y puede ser ligeramente incorrecto.

El Active Directory schema reference será útil. Comprenda que el esquema se puede modificar y extender (por ejemplo, la instalación de Exchange agregará información del buzón a los usuarios).

AD Explorer es una herramienta útil que puede utilizar para la depuración y la administración de datos de bajo nivel de AD. Lo encontré útil cuando sé qué propiedad quiero establecer pero no puedo encontrar el cuadro de diálogo correcto en la herramienta de administración de AD.

+0

Acabo de agregar un código que es básicamente lo que dijiste.Usé el DirectorySearcher y obtuve la información que necesitaba. Afortunadamente, solo tengo que recuperar información muy básica. –

+0

para mí, escribiendo ldap en minúscula lanzó una COMException. –

0

He utilizado una biblioteca LDAP estándar para recuperar información de un servidor de Active Directory, pero tendría que verificar que los datos que necesita estén disponibles a través del esquema del servidor LDAP. En general, puede obtener cualquier información almacenada en InetOrganizationalPerson y la mayoría de la información relacionada con los grupos a los que pertenecen.

5

Puede encontrar el siguiente fragmento útil como iniciador.

public static bool IsUserInGroup(string lanid, string group) 
{ 
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH); 
    if(entry != null) 
    { 
     [email protected]"LDAPUSER"; 
     entry.Password="LDAPPASSWORD"; 
     DirectorySearcher srch = new DirectorySearcher(entry); 
     srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid); 
     srch.PropertiesToLoad.Add("memberOf"); 

     SearchResult result = srch.FindOne(); 
     if(result != null) 
     { 
      if(result.Properties.Contains("memberOf")) 
      { 
       string lookfor = String.Format("cn={0},", group.ToLower()); 
       foreach(string memberOf in result.Properties["memberOf"]) 
       { 
        if(memberOf.ToLower().StartsWith(lookfor)) 
         return true; 
       } 
      } 
     } 
     return false; 
    } 
    throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}", lanid, group)); 
} 
Cuestiones relacionadas