使用包含和OR查询搜索Active Directory用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用包含和OR查询搜索Active Directory用户相关的知识,希望对你有一定的参考价值。

我编写了这段代码来查找显示名称包含某个字符串的用户。我想改进这个查询,以便它返回包含firstnamelastnamedisplayname中字符串的任何人(现在它只对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

如何在 php 中使用 LDAP 从 Active Directory 搜索和更新用户数据?

动态 Sql- 活动字段搜索条件问题

LDAP:如何从 Active Directory 中获取所有用户和组