使用 C# 从 Active Directory 获取多个具有相似名称的用户
本文关键字:相似 用户 Active Directory 获取 使用 | 更新日期: 2023-09-27 18:31:24
我需要显示具有类似 AD 名称的用户列表(自动完成)。例如,如果我搜索 Arthur 并且有 2 个人具有相同的姓名(名字或姓氏),我应该在自动完成中显示这两个名字。我试图获取名称,但大约需要 2-4 分钟才能获得名称。我正在使用以下代码:
string[] domainNames = new string[] { "domain1", "domain2" };
List<string> userNames = new List<string>();
string user = string.Empty;
foreach (string domain in domainNames)
{
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
{
GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, "Domain Users");
if (group != null)
{
foreach (Principal p in group.GetMembers(false))
{
if (p.Name.ToLower().Contains(key.ToLower()))
{
if (!userNames.Contains(p.Name))
userNames.Add(p.Name);
}
}
}
}
}
有什么方法可以加快这个过程吗?我已经在使用 ajax 调用了。
DirectorySearcher ds = new DirectorySearcher();
ds.SearchRoot = new DirectoryEntry("LDAP://" + domain, domain + @"'" + userName, password);
ds.Filter = "(&(objectClass=user)(cn=*" + key + "*))";
ds.PropertyNamesOnly = true;
ds.PropertiesToLoad.Add("name");
ds.PropertiesToLoad.Add("cn");
foreach (SearchResult searchResults in ds.FindAll())
{
foreach (string propertyName in searchResults.Properties.PropertyNames)
{
foreach (Object retEntry in searchResults.Properties[propertyName])
{
var user = retEntry.ToString().Split('/').Where(x => x.Contains("CN")).Select(y => y).FirstOrDefault().Split(',').Where(z => z.Contains("CN")).Select(c => c).FirstOrDefault().Split(',').FirstOrDefault().Split('=')[1];
if(!string.IsNullOrWhiteSpace(user))
userNames.Add(user);
}
}
}
减少到 30-40 秒。
cn=
过滤器并不真正有效 - 没有什么可以保证这种格式。相反,查找不明确的名称解析 - 它是为此而设计的:http://social.technet.microsoft.com/wiki/contents/articles/22653.active-directory-ambiguous-name-resolution.aspx。