【问题标题】:Complex Search Filtering with PrincipalSearcher使用 PrincipalSearcher 进行复杂搜索过滤
【发布时间】:2016-09-20 19:03:05
【问题描述】:

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

【问题讨论】:

    标签: c# active-directory userprincipal principalsearcher


    【解决方案1】:

    所以我终于在 Reddit 用户 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 帖子的链接即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2019-07-14
      • 2019-04-25
      相关资源
      最近更新 更多