使用包含和OR查询搜索Active Directory用户
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用包含和OR查询搜索Active Directory用户相关的知识,希望对你有一定的参考价值。
我编写了这段代码来查找显示名称包含某个字符串的用户。我想改进这个查询,以便它返回包含firstname
或lastname
或displayname
中字符串的任何人(现在它只对displayname进行过滤)。
那可能吗?我似乎无法在这些查询/过滤器中找到使用OR的任何示例。
List<ADUser> adUsers = new List<ADUser>();
DirectoryEntry directoryEntry = Domain.GetCurrentDomain().GetDirectoryEntry();
DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);
directorySearcher.PropertiesToLoad.Add("samaccountname");
directorySearcher.PropertiesToLoad.Add("mail");
directorySearcher.PropertiesToLoad.Add("usergroup");
directorySearcher.PropertiesToLoad.Add("displayname");
directorySearcher.PropertiesToLoad.Add("firstname");
directorySearcher.PropertiesToLoad.Add("lastname");
directorySearcher.Filter = "(&(objectClass=User) (displayname=*" + searchQuery + "*))";
SearchResultCollection searchResultCollection = directorySearcher.FindAll();
foreach (SearchResult u in searchResultCollection)
{
var user = new ADUser()
{
UserName = u?.Properties?.Contains("samaccountname") == true ? u?.Properties["samaccountname"][0]?.ToString() : String.Empty,
DisplayName = u?.Properties?.Contains("displayname") == true ? u?.Properties["displayname"][0]?.ToString() : String.Empty,
FirstName = u?.Properties?.Contains("firstname") == true ? u?.Properties["firstname"][0]?.ToString() : String.Empty,
LastName = u?.Properties?.Contains("lastname") == true ? u?.Properties["lastname"][0]?.ToString() : String.Empty,
Email = u?.Properties?.Contains("mail") == true ? u?.Properties["mail"][0]?.ToString() : String.Empty,
UserGroup = u?.Properties?.Contains("usergroup") == true ? u?.Properties["usergroup"][0]?.ToString() : String.Empty,
};
adUsers.Add(user);
}
答案
您正在寻找|
,它是LDAP中的OR运算符:
directorySearcher.Filter = "(&(objectClass=User)(|(displayName=*" + searchQuery + "*)(givenName=*" + searchQuery + "*)(sn=*" + searchQuery + "*)))";
另一个选择是使用Ambigious Name Resolution(虽然这也会将搜索条件中的每个单词应用于邮件地址属性和用户名,而不仅仅是显示名称,给定名称和姓氏):
directorySearcher.Filter = "(&(objectClass=User)(anr=" + searchQuery + "))";
以上是关于使用包含和OR查询搜索Active Directory用户的主要内容,如果未能解决你的问题,请参考以下文章
进一步改进Active Record / Postgresql查询
查询由给定经理的 sAMAccountName 管理的 Active Directory 用户
通过用户的自定义属性搜索 Active Directory B2C