2010-03-29 6 views
10

Ich habe einige Probleme mit Code, der einen Benutzer in Active Directory durch Suche nach ihrer E-Mail-Adresse suchen soll. Ich habe 2 Methoden ausprobiert, aber manchmal finde ich, dass die FindOne() Methode bei manchen Gelegenheiten keine Ergebnisse liefert. Wenn ich den Benutzer in der GAL in Outlook nachschaue, sehe ich die SMTP-E-Mail-Adresse aufgelistet.Korrekte Methode für die Suche nach AD-Benutzer nach E-Mail-Adresse von .NET

Mein Endziel ist zu bestätigen, dass der Benutzer in AD vorhanden ist. Ich habe nur die E-Mail-Adresse als Suchkriterien, also keine Möglichkeit, den Vor- oder Nachnamen zu verwenden.

Methode 1: Verwenden Mail Eigenschaft:

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

Methode 2: Proxyaddresses Eigenschaft:

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

Ich habe versucht, den Fall der E-Mail-Adresseingabe zu ändern, aber es zurückkehrt, noch keine Ergebnis. Gibt es hier ein Problem mit der Groß-/Kleinschreibung? Wenn ja, wie kann man das am besten lösen?

+0

Ich denke, ich habe das Problem gefunden. Der DirectoryEntry.Path wurde auf eine bestimmte Domäne beschränkt. Ich habe den Code geändert, um den globalen Katalog zu verwenden, und die Suche funktioniert. Ich werde zurückkommen und bald updaten. Antworten auf Mail vs. ProxyAddresses sind willkommen, wenn jemand etwas hinzuzufügen hat. –

Antwort

0

Ich hatte noch nie Probleme mit der Groß-/Kleinschreibung bei der Suche nach E-Mail-Adressen von Benutzern - was passiert, wenn Sie die Adresse genau so suchen, wie sie in ADSIEDIT angezeigt wird? Findet es die Adresse, wenn es richtig verpackt ist?

BTW, ich habe immer die "mail" -Eigenschaft verwendet, da sie die einzelne ausgehende E-Mail-Adresse des Benutzers zurückgibt, auch wenn dem Konto mehrere Adressen zugeordnet sind. Die Eigenschaft "proxyAddresses" ist eigentlich eine Eigenschaft mit mehreren Werten, und Sie suchen nur nach dem Wert, der mit "smtp:" beginnt (in der Eigenschaft in Kleinbuchstaben). Ein Benutzer könnte jedoch mehrere SMTP-Adressen in seinem AD-Konto haben (wir tun dies), so dass zwischen den beiden die Eigenschaft "mail" möglicherweise das ist, wonach Sie suchen.

13

Wenn Sie Exchange Server verwenden, ist ProxyAddresses das zuverlässigste Mittel, um ihre E-Mail-Adresse zu erhalten. Die primäre SMTP-Adresse wird durch Großbuchstaben angezeigt "SMTP:" und zusätzliche E-Mail-Adressen werden mit Kleinbuchstaben "SMTP:" vorangestellt. Das Attribut "mail" muss nicht notwendigerweise die primäre SMTP-Adresse sein, obwohl dies normalerweise der Fall ist. Hier

ist eine Variante von Code I verwendet:

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

ich gefunden habe, dass SysInternals ADExplorer mit groß ist für die Erprobung/Debugging Active Directory-Abfragen. Wie Sie die Abfragen erstellen und sie gegen Active Directory ausführen können Sie die Ergebnisse sehen sowie problemlos Objekte anzeigen und alle ihre Eigenschaften sehen ...