2016-09-20 88 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帖子的链接即可。