使用C#从Active Directory中获取具有相似名称的多个用户
问题描述:
我需要显示AD中具有相似名称的用户列表(自动填充中)。例如,如果我搜索亚瑟并且有两个同名的人(名字或姓氏),我应该在自动填充中显示两个名字。我试图得到这些名字,但大约需要2-4分钟才能得到名字。我正在使用以下代码:使用C#从Active Directory中获取具有相似名称的多个用户
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=
过滤器不是真的有效 - 没有什么能保证这种格式。相反,查找Ambigous名称解析 - 它是专为此设计的:http://social.technet.microsoft.com/wiki/contents/articles/22653.active-directory-ambiguous-name-resolution.aspx。
我不认为你可以期望从AD获得足够快的响应,以便用于自动完成的查询。因此,您必须提前获取_all_ AD条目列表,并将它们保存在List 或类似内容中,以便在用户输入时进行快速查找。 – RenniePet 2014-11-21 07:24:27
另一个想法:我不熟悉PrincipalContext对象或它如何用于获取AD条目。我创建的从AD读取的程序基于LDAP。下面是让我开始的示例:http://www.codeproject.com/Articles/4237/Querying-Active-Directory-using-NET-classes-and-LD但是请注意在2010年某个RenniePet的评论。 – RenniePet 2014-11-21 07:26:33
我发现下面的网站对于查询非常有用:http://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx – Shanky 2014-11-21 13:58:52