2014-11-21 107 views
0

我需要顯示AD中具有相似名稱的用戶列表(自動填充中)。例如,如果我搜索亞瑟並且有兩個同名的人(名字或姓氏),我應該在自動填充中顯示兩個名字。我試圖得到這些名字,但大約需要2-4分鐘才能得到名字。我正在使用以下代碼:使用C#從Active Directory中獲取具有相似名稱的多個用戶

 string[] domainNames = new string[] { "domain1", "domain2" }; 
     List<string> userNames = new List<string>(); 
     string user = string.Empty; 

     foreach (string domain in domainNames) 
     { 
      using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain)) 
      { 
       GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, "Domain Users"); 
       if (group != null) 
       { 
        foreach (Principal p in group.GetMembers(false)) 
        { 
         if (p.Name.ToLower().Contains(key.ToLower())) 
         { 
          if (!userNames.Contains(p.Name)) 
           userNames.Add(p.Name); 
         } 
        } 
       } 
      } 
     } 

任何方式我可以加快過程?我已經在使用ajax調用。

+0

我不認爲你可以期望從AD獲得足夠快的響應,以便用於自動完成的查詢。因此,您必須提前獲取_all_ AD條目列表,並將它們保存在List <>或類似內容中,以便在用戶輸入時進行快速查找。 – RenniePet 2014-11-21 07:24:27

+0

另一個想法:我不熟悉PrincipalContext對象或它如何用於獲取AD條目。我創建的從AD讀取的程序基於LDAP。下面是讓我開始的示例:http://www.codeproject.com/Articles/4237/Querying-Active-Directory-using-NET-classes-and-LD但是請注意在2010年某個RenniePet的評論。 – RenniePet 2014-11-21 07:26:33

+0

我發現下面的網站對於查詢非常有用:http://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx – Shanky 2014-11-21 13:58:52

回答

0
 DirectorySearcher ds = new DirectorySearcher(); 
     ds.SearchRoot = new DirectoryEntry("LDAP://" + domain, domain + @"\" + userName, password); 
     ds.Filter = "(&(objectClass=user)(cn=*" + key + "*))"; 
     ds.PropertyNamesOnly = true; 
     ds.PropertiesToLoad.Add("name"); 
     ds.PropertiesToLoad.Add("cn"); 

     foreach (SearchResult searchResults in ds.FindAll()) 
     { 
      foreach (string propertyName in searchResults.Properties.PropertyNames) 
      { 
       foreach (Object retEntry in searchResults.Properties[propertyName]) 
       { 
        var user = retEntry.ToString().Split('/').Where(x => x.Contains("CN")).Select(y => y).FirstOrDefault().Split(',').Where(z => z.Contains("CN")).Select(c => c).FirstOrDefault().Split(',').FirstOrDefault().Split('=')[1]; 
        if(!string.IsNullOrWhiteSpace(user)) 
         userNames.Add(user); 
       } 
      } 
     } 

減少到30-40秒。

相關問題