2010-03-29 35 views
10

Tengo algunos problemas con el código que intenta encontrar un usuario en Active Directory al buscar en su dirección de correo electrónico. He intentado con 2 métodos pero a veces encuentro que el método FindOne() no arroja ningún resultado en algunas ocasiones. Si busco al usuario en el GAL en Outlook, veo la dirección de correo electrónico SMTP en la lista.Método correcto para buscar usuario de AD por dirección de correo electrónico de .NET

Mi objetivo final es confirmar que el usuario exista en AD. Solo tengo la dirección de correo electrónico como criterio de búsqueda, por lo que no hay forma de usar nombre o apellido.

Método 1: Usar la propiedad de correo:

DirectorySearcher search = new DirectorySearcher(entry); 
search.Filter = "(mail=" + email + ")"; 
search.PropertiesToLoad.Add("mail"); 
SearchResult result = search.FindOne(); 

Método 2: proxyAddresses propiedad:

DirectorySearcher search = new DirectorySearcher(entry); 
search.Filter = "(proxyAddresses=SMTP:" + email + ")"; // I've also tried with =smtp: 
search.PropertiesToLoad.Add("mail"); 
SearchResult result = search.FindOne(); 

He intentado cambiar el caso de la entrada de dirección de correo electrónico, pero todavía no devuelve una resultado. ¿Hay algún problema aquí con la distinción entre mayúsculas y minúsculas? Si es así, ¿cuál es la mejor manera de resolverlo?

+0

Creo que he encontrado el problema. DirectoryEntry.Path se estableció en un dominio específico. Cambié el código para usar el catálogo global y la búsqueda está funcionando. Volveré y lo actualizaré pronto. Respuestas en correo contra proxyAddresses es bienvenido si alguien tiene algo que agregar. –

Respuesta

0

Nunca he tenido problemas con la sensibilidad de mayúsculas y minúsculas para buscar las direcciones de correo electrónico de los usuarios. ¿Qué sucede si busca la dirección exactamente como aparece en ADSIEDIT? ¿Encuentra la dirección cuando está colocada correctamente?

BTW, siempre he usado la propiedad "mail", ya que devuelve la única dirección de correo electrónico saliente predeterminada del usuario, incluso si hay varias direcciones asociadas a la cuenta. La propiedad "proxyAddresses" es en realidad una propiedad multivalor, y solo está buscando el valor que comienza con "smtp:" (está en minúscula en la propiedad). Sin embargo, un usuario puede tener múltiples direcciones SMTP en su cuenta AD (lo hacemos), por lo que entre los dos, la propiedad "correo" puede ser lo que está buscando.

13

Si usa Exchange Server, proxyAddresses es el medio más confiable para obtener su dirección de correo electrónico. La dirección smtp principal se indica mediante mayúsculas "SMTP:" y las direcciones de correo electrónico adicionales tendrán el prefijo "smtp:" en minúscula. El atributo "correo" no necesariamente tiene que ser la dirección SMTP principal, aunque normalmente sí lo es.

Aquí es una variación de un código utilicé:

public static SearchResult FindAccountByEmail(string email) 
    { 
     string filter = string.Format("(proxyaddresses=SMTP:{0})", email); 

     using (DirectoryEntry gc = new DirectoryEntry("GC:")) 
     { 
      foreach (DirectoryEntry z in gc.Children) 
      { 
       using (DirectoryEntry root = z) 
       { 
        using (DirectorySearcher searcher = new DirectorySearcher(root, filter, new string[] { "proxyAddresses", "objectGuid", "displayName", "distinguishedName" })) 
        { 
         searcher.ReferralChasing = ReferralChasingOption.All; 
         SearchResult result = searcher.FindOne(); 

         return result; 
        } 
       } 
       break; 
      } 
     } 

     return null; 
    } 

    static void Main(string[] args) 
    { 
     SearchResult result = FindAccountByEmail("[email protected]"); 

     string distinguishedName = result.Properties["distinguishedName"][0] as string; 
     string name = result.Properties["displayName"] != null 
         ? result.Properties["displayName"][0] as string 
         : string.Empty; 
     Guid adGuid = new Guid((byte[]) (result.Properties["objectGUID"][0])); 

     string emailAddress; 
     var emailAddresses = (from string z in result.Properties["proxyAddresses"] 
           where z.StartsWith("SMTP") 
           select z); 
     emailAddress = emailAddresses.Count() > 0 ? emailAddresses.First().Remove(0, 5) : string.Empty; 


     Console.WriteLine(string.Format("{1}{0}\t{2}{0}\t{3}{0}\t{4}", 
         Environment.NewLine, 
         name, 
         distinguishedName, 
         adGuid, 
         emailAddress)); 
    } 
3

que he encontrado que el uso de SysInternals ADExplorer es ideal para poner a prueba/depuración consultas de Active Directory. Como puede crear las consultas y ejecutarlas en Active Directory, puede ver los resultados, así como ver objetos fácilmente y ver todas sus propiedades ...

Cuestiones relacionadas