我在Active Directory中使用PrincipalSearcher对象搜索特定的PrincipalSearcher值,因为我想返回UserPrincipal的值。我想知道如何将两个筛选器应用到该搜索中;一个是帐户名的开头,另一个是它不以_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过滤器。因此,如果有人知道如何在返回主体对象的同时实现这些对象,这将是非常有帮助的。
发布于 2016-10-13 17:41:09
所以我终于在Reddit用户从这个岗位上的帮助下回答了这个问题
由于我的程序设置方式,理想情况下,我需要返回主体对象,尽管有些转换或转换是可用的。使用额外筛选返回主体对象的解决方案是使用LINQ语句来筛选返回的结果。
要合并LINQ语句,我所需要做的就是修改一行,即I search.FindAll();的行,如下所示,
var principals = search.FindAll().Where(p => !p.SamAccountName.EndsWith("_c", StringComparison.OrdinalIgnoreCase)).ToList();因为最初的筛选是为了找到所有的xx*,所以我只需要删除以_c结尾的帐户,但是LINQ有很多筛选选项可用。
Reddit上的用户也给了我一些其他的建议,因为如果你有大量返回的结果需要过滤,LINQ可能会很慢,但是我选择了更快更简单的答案。如果你想看到这些建议,只需按照链接到Reddit帖子。
https://stackoverflow.com/questions/39601928
复制相似问题