2016-09-20 61 views
0

我在Active Directory中搜索使用PrincipalSearcher對象的特定SamAccountName值,因爲我想返回UserPrincipal's。我想知道如何將兩個過濾器應用於該搜索;一個是帳戶名稱的開始以xx開頭,另一個是不以_c結尾。使用PrincipalSearcher進行復雜搜索過濾

目前我可以使用xx*搜索以xx開頭的所有結果,但我無法弄清楚如何添加另一個搜索詞或者甚至不適用搜索詞。這是我目前的工作。

protected override void RunTests() 
{ 
    using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "NAME", "OU=OUName",OU=name,DC=name,DC=net")) 
    { 
     UserPrincipal searchTemplate = new UserPrincipal(context); 
     searchTemplate.Enabled = true; 
     searchTemplate.SamAccountName = "xx*"; 

     PrincipalSearcher search = new PrincipalSearcher(searchTemplate); 

     var principals = search.FindAll(); 
     int total = principals.Count();    

     int numInvalidUsers = RunChecks(principals, new Check[]{ 
      Check1  
      , Check2 
      , Check3 
     }); 

     Score = numInvalidUsers == 0 ? 1 : 0; 
    } 
} 

我在想什麼是我需要另一個參數添加到searchTemplate.SamAccountName,我只是不知道如何。

更新: 我是說有人在Reddit誰是給我一些有用的建議,但該用戶已經黑了。似乎最常見的建議是以某種方式實現LDAP過濾器。所以如果有人知道如何實現這些,同時仍然返回主要對象,這將是非常有用的。

回答

0

所以,我終於回答了這個問題,以reddit的用戶from this post

,因爲我怎麼有我的程序設置非常需要我雖然有些鑄造或轉換爲可返回主對象的幫助。用一些額外的過濾來返回principals對象的解決方案是使用LINQ語句來更多地過濾返回的結果。

要合併LINQ語句中的所有我需要做的是改變一條線,在那裏我search.FindAll();這確實如下,

var principals = search.FindAll().Where(p => !p.SamAccountName.EndsWith("_c", StringComparison.OrdinalIgnoreCase)).ToList(); 

因爲最初的篩選是爲了找到所有的線XX *我只需要以此語句刪除以_c結尾的帳戶,但是LINQ有許多過濾選項。

Reddit上的用戶還提供了一些其他建議,因爲如果您有大量返回的結果需要過濾,那麼LINQ可能會很慢,但我選擇了更快,更簡單的答案。如果您想查看這些建議,只需點擊Reddit帖子的鏈接即可。