我在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过滤器。因此,如果有人知道如何实现这些,同时仍然返回非常有用的主要对象。
答案 0 :(得分: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帖子的链接。