1

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

目前我可以使用 xx 搜索所有以 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 过滤器。因此,如果有人知道如何在返回主体对象的同时实现这些,那将非常有帮助。

4

1 回答 1

1

所以我终于在这篇文章的 Reddit 用户的帮助下回答了这个问题

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

To incorporate the LINQ statement all I needed to do was alter one line, the line where I search.FindAll(); which does as follows,

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

Because the initial filtering is done to find all xx* I only needed to remove the accounts ending in _c with this statement, however there are lots of filtering options available with LINQ.

The user on Reddit also offered me some other suggestions since LINQ can be slow if you have a large number of returned results need to be filtered but I went for the quicker and easier answer. If you would like to see those suggestions just follow the link to the Reddit post.

于 2016-10-13T17:41:09.883 回答