2010-03-29 3 views
10

Mam pewne problemy z kodem, który ma na celu znalezienie użytkownika w usłudze Active Directory, wyszukując jego adres e-mail. Próbowałem 2 metody, ale czasami stwierdzam, że metoda FindOne() nie zwraca żadnych wyników przy niektórych okazjach. Jeśli sprawdzę użytkownika w GAL w Outlooku, zobaczę adres e-mail SMTP na liście.Prawidłowa metoda wyszukiwania użytkownika AD za pomocą adresu e-mail od .NET

Moim końcowym celem jest potwierdzenie, że użytkownik istnieje w AD. Mam tylko adres e-mail jako kryteria wyszukiwania, więc nie ma możliwości użycia imienia ani nazwiska.

Metoda 1: Używanie nieruchomość mail:

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

Metoda 2: nieruchomość proxyAddresses:

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

Próbowałem zmieniając przypadek wprowadzania adresu e-mail, ale to nadal nie zwraca wynik. Czy jest tu problem z rozróżnianiem wielkości liter? Jeśli tak, jaki jest najlepszy sposób rozwiązania tego problemu?

+0

Myślę, że znalazłem problem. Plik DirectoryEntry.Path został ograniczony do określonej domeny. Zmieniłem kod, aby korzystać z Katalogu globalnego, a wyszukiwanie działa. Wrócę i wkrótce się zaktualizuję. Odpowiedzi na maile vs. proxyAddresses są mile widziane, jeśli ktoś ma coś do dodania. –

Odpowiedz

0

Nigdy nie miałem problemów z rozróżnianiem wielkości liter w wyszukiwaniu adresów e-mail użytkowników - co się stanie, gdy wyszukasz adres dokładnie tak, jak jest wyświetlany w ADSIEDIT? Czy znajduje adres, gdy jest prawidłowo obudowany?

BTW, zawsze korzystałem z właściwości "mail", ponieważ zwraca pojedynczy domyślny wychodzący adres e-mail użytkownika, nawet jeśli do konta dołączonych jest wiele adresów. Właściwość "proxyAddresses" jest w rzeczywistości właściwością wielowartościową, a użytkownik szuka wartości, która zaczyna się od "smtp:" (jest to małe we właściwości). Jednak użytkownik może mieć wiele adresów SMTP na swoim koncie AD (my tak), więc między tymi dwoma, właściwość "mail" może być tym, czego szukasz.

13

Jeśli korzystasz z programu Exchange Server, proxyAddresses jest najbardziej niezawodnym sposobem uzyskania adresu e-mail. Podstawowy adres smtp jest oznaczony wszystkimi literami "SMTP:", a dodatkowe adresy e-mail będą poprzedzone małymi literami "smtp:". Atrybut "mail" niekoniecznie musi być podstawowym adresem SMTP, chociaż zazwyczaj tak jest.

Oto wariacja jakiegoś kodu użyłem:

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

Odkryłem, że używanie SysInternals ADExplorer jest dobre dla testowania/debugowania zapytań Active Directory. Ponieważ możesz budować zapytania i uruchamiać je w Active Directory, możesz zobaczyć wyniki, a także łatwo przeglądać obiekty i zobaczyć wszystkie ich właściwości ...

Powiązane problemy