使用PrincipalSearcher进行复杂搜索过滤

时间:2016-09-20 19:03:06

标签: c# active-directory userprincipal principalsearcher

我在Active Directory中使用SamAccountName对象搜索特定的PrincipalSearcher值,因为我想返回UserPrincipal。我想知道如何在搜索中应用两个过滤器;一个是帐户名称的开头,以xx开头,另一个是不以_c结尾。

目前,我可以使用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过滤器。因此,如果有人知道如何实现这些,同时仍然返回非常有用的主要对象。

1 个答案:

答案 0 :(得分:1)

所以我最后在Re​​ddit用户from this post

的帮助下回答了这个问题

由于我的程序设置理想,我需要返回主要对象,尽管有一些转换或转换可用。通过一些额外的过滤返回主体对象的解决方案是使用LINQ语句来过滤返回的结果。

要合并LINQ语句,我需要做的就是改变一行,即search.FindAll();所在的行,如下所示,

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

因为初始过滤是为了查找所有xx *我只需要使用此语句删除以_c结尾的帐户,但是LINQ有很多过滤选项。

Reddit上的用户也向我提供了一些其他的建议,因为如果你需要过滤大量的返回结果,LINQ可能会很慢,但我选择了更快更简单的答案。如果您希望看到这些建议,请点击Reddit帖子的链接。