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

问题描述 投票:0回答:1

我编写了这段代码来查找显示名称包含某个字符串的用户。我想改进这个查询,以便它返回包含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);
}
c# .net active-directory
1个回答
2
投票

您正在寻找|,它是LDAP中的OR运算符:

directorySearcher.Filter = "(&(objectClass=User)(|(displayName=*" + searchQuery + "*)(givenName=*" + searchQuery + "*)(sn=*" + searchQuery + "*)))";

另一个选择是使用Ambigious Name Resolution(虽然这也会将搜索条件中的每个单词应用于邮件地址属性和用户名,而不仅仅是显示名称,给定名称和姓氏):

directorySearcher.Filter = "(&(objectClass=User)(anr=" + searchQuery + "))";
© www.soinside.com 2019 - 2024. All rights reserved.