使用 PrincipalSearcher 进行复杂的搜索过滤

Complex Search Filtering with PrincipalSearcher

我正在使用 PrincipalSearcher 对象在 Active Directory 中搜索特定的 SamAccountName 值,因为我想 return 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 过滤器。因此,如果有人知道如何在仍然 returning 主要对象的同时实现这些,那将非常有帮助。

所以我终于在 Reddit 用户的帮助下回答了这个问题 from this post

由于我理想地设置了我的程序,所以我需要 return 主体对象,尽管可以进行一些转换或转换。 returning principals objects with some extra filtering 的解决方案是使用 LINQ 语句来进一步过滤 returned 结果。

要合并 LINQ 语句,我需要做的就是更改一行,即我 search.FindAll(); 执行以下操作的那一行,

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

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

Reddit 上的用户还向我提供了一些其他建议,因为如果您有大量 returned 结果需要过滤,LINQ 可能会很慢,但我选择了更快速、更简单的答案。如果您想查看这些建议,只需关注 link 到 Reddit post.