2010-03-29 13 views
10

Sto riscontrando alcuni problemi con il codice destinato a trovare un utente in Active Directory effettuando una ricerca sul proprio indirizzo di posta elettronica. Ho provato 2 metodi, ma a volte sto trovando che il metodo FindOne() non restituirà alcun risultato in alcune occasioni. Se cerco l'utente nel GAL in Outlook, vedo l'indirizzo email SMTP elencato.Metodo corretto per cercare l'utente AD tramite indirizzo di posta elettronica da .NET

Il mio obiettivo finale è confermare che l'utente esista in AD. Ho solo l'indirizzo email come criterio di ricerca, quindi non c'è modo di usare il nome o il cognome.

Metodo 1: Utilizzo di proprietà mail:

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

Metodo 2: proxyAddresses proprietà:

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

Ho provato a cambiare il caso dell'ingresso di indirizzo di posta elettronica, ma ancora non restituisce un risultato. C'è un problema qui con la distinzione tra maiuscole e minuscole? Se sì, qual è il modo migliore per risolverlo?

+0

Penso di aver trovato il problema. DirectoryEntry.Path era con ambito per un dominio specifico. Ho cambiato il codice per utilizzare il catalogo globale e la ricerca funziona. Tornerò e aggiornerò presto. Le risposte sulla posta rispetto a proxyAddresses sono le benvenute se qualcuno ha qualcosa da aggiungere. –

risposta

0

Non ho mai avuto problemi con la distinzione tra maiuscole e minuscole alla ricerca degli indirizzi email degli utenti: cosa succede se si cerca l'indirizzo esattamente come appare in ADSIEDIT? Trova l'indirizzo quando è incassato correttamente?

BTW, ho sempre utilizzato la proprietà "mail", in quanto restituisce il singolo indirizzo email in uscita predefinito dell'utente, anche se ci sono più indirizzi collegati all'account. La proprietà "proxyAddresses" è in realtà una proprietà con più valori e si sta solo cercando il valore che inizia con "smtp:" (è in minuscolo nella proprietà). Tuttavia, un utente potrebbe avere più indirizzi SMTP sul suo account AD (lo facciamo noi), quindi tra i due, la proprietà "mail" potrebbe essere ciò che stai cercando.

13

Se si utilizza Exchange Server, proxyAddresses è il mezzo più affidabile per ottenere il proprio indirizzo di posta elettronica. L'indirizzo smtp primario è indicato da "SMTP:" maiuscole e gli indirizzi e-mail aggiuntivi saranno preceduti da "smtp:" in minuscolo. L'attributo "mail" non deve necessariamente essere l'indirizzo SMTP primario, sebbene di solito lo sia.

Ecco una variazione di qualche codice che ho usato:

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

ho trovato che utilizzando SysInternals ADExplorer è grande per testare/debug query di Active Directory. Come puoi costruire le query ed eseguirle contro Active Directory puoi vedere i risultati così come visualizzare facilmente gli oggetti e vedere tutte le loro proprietà ...

Problemi correlati