2010-03-29 36 views
10

Tôi đang gặp một số vấn đề với mã nhằm tìm người dùng trong Active Directory bằng cách tìm kiếm trên địa chỉ email của họ. Tôi đã thử 2 phương pháp nhưng đôi khi tôi thấy rằng phương thức FindOne() sẽ không trả lại bất kỳ kết quả nào trong một số trường hợp. Nếu tôi tra cứu người dùng trong GAL trong Outlook, tôi sẽ thấy địa chỉ email SMTP được liệt kê.Phương pháp đúng để tìm kiếm người dùng AD theo địa chỉ email từ .NET

Mục tiêu cuối cùng của tôi là xác nhận rằng người dùng tồn tại trong AD. Tôi chỉ có địa chỉ email làm tiêu chí tìm kiếm, vì vậy không có cách nào để sử dụng tên hoặc họ.

Phương pháp 1: Sử dụng tài sản mail:

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

Cách 2: proxyAddresses tài sản:

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

tôi đã cố gắng thay đổi trường hợp của các đầu vào địa chỉ email nhưng nó vẫn không trả lại một kết quả. Có vấn đề gì ở đây với trường hợp nhạy cảm không? Nếu vậy, cách tốt nhất để giải quyết nó là gì?

+0

Tôi nghĩ rằng tôi đã tìm thấy vấn đề. DirectoryEntry.Path đã được dò tìm đến một miền cụ thể. Tôi đã thay đổi mã để sử dụng Danh mục chung và tìm kiếm đang hoạt động. Tôi sẽ quay lại và cập nhật sớm. Câu trả lời trên thư so với proxyAddresses được chào đón nếu ai đó có bất cứ điều gì để thêm. –

Trả lời

0

Tôi chưa bao giờ có bất kỳ vấn đề nào với độ nhạy trường hợp tìm kiếm địa chỉ email của người dùng - điều gì sẽ xảy ra nếu bạn tìm kiếm địa chỉ, chính xác như xuất hiện trong ADSIEDIT? Liệu nó tìm thấy địa chỉ khi nó được cased một cách chính xác?

BTW, tôi đã luôn sử dụng thuộc tính "thư", vì nó trả về địa chỉ email gửi đi mặc định duy nhất của người dùng, ngay cả khi có nhiều địa chỉ được đính kèm với tài khoản. Thuộc tính "proxyAddresses" thực sự là thuộc tính nhiều giá trị và bạn chỉ đang tìm kiếm giá trị bắt đầu bằng "smtp:" (chữ thường trong thuộc tính). Tuy nhiên, người dùng có thể có nhiều địa chỉ SMTP trên tài khoản AD của họ (chúng tôi làm), vì vậy, giữa hai tài khoản, "thư" có thể là những gì bạn đang tìm kiếm.

13

Nếu bạn đang sử dụng Exchange Server, proxyAddresses là phương tiện đáng tin cậy nhất để nhận địa chỉ email của họ. Địa chỉ smtp chính được chỉ định bởi tất cả các mũ "SMTP:" và các địa chỉ email bổ sung sẽ được bắt đầu bằng chữ thường "smtp:". Thuộc tính "mail" không nhất thiết phải là địa chỉ SMTP chính, mặc dù thường là nó.

Đây là một biến thể của một số mã tôi đã sử dụng:

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

tôi đã tìm thấy rằng việc sử dụng SysInternals ADExplorer là rất tốt để thử nghiệm ra/gỡ lỗi thư mục truy vấn Active Directory. Như bạn có thể xây dựng các truy vấn và chạy chúng đối với Active Directory, bạn có thể xem kết quả cũng như dễ dàng xem các đối tượng và xem tất cả tài sản của họ ...

Các vấn đề liên quan