C# 使用C从Active Directory获取具有相似名称的多个用户#

C# 使用C从Active Directory获取具有相似名称的多个用户#,c#,active-directory,C#,Active Directory,我需要显示一个用户列表(在自动完成中),这些用户的名字与广告中的相似。例如,如果我搜索Arthur,有两个人的名字(名字或姓氏)相同,我应该在自动完成中显示这两个名字。我试着取名字,但要取名字大约需要2-4分钟。我正在使用以下代码: string[] domainNames = new string[] { "domain1", "domain2" }; List<string> userNames = new List<string>()

我需要显示一个用户列表(在自动完成中),这些用户的名字与广告中的相似。例如,如果我搜索Arthur,有两个人的名字(名字或姓氏)相同,我应该在自动完成中显示这两个名字。我试着取名字,但要取名字大约需要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);
                        }
                    }
                }
            }
        }
string[]domainNames=新字符串[]{“domain1”、“domain2”};
列表用户名=新列表();
string user=string.Empty;
foreach(域名中的字符串域)
{
使用(PrincipalContext pc=new PrincipalContext(ContextType.Domain,Domain))
{
GroupPrincipal group=GroupPrincipal.FindByIdentity(pc,IdentityType.SamAccountName,“域用户”);
如果(组!=null)
{
foreach(groups.GetMembers中的主体p(false))
{
if(p.Name.ToLower().Contains(key.ToLower()))
{
如果(!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=
过滤器不是真的有效-没有任何东西可以保证这种格式。取而代之的是查找模糊名称解析-它是为以下目的设计的:。

我认为您无法期望从广告中获得足够快的响应,以便查询用于自动完成。因此,您必须提前获取所有广告条目的列表,并将它们保存在列表或类似的内容中,以便在用户键入时快速查找。另一个想法是:我不熟悉PrincipalContext对象,也不熟悉它如何用于获取广告条目。我创建的用于读取广告的程序是基于LDAP的。以下是让我开始学习的示例:但请注意2010年某个RenniePet的评论。我发现下面的网站对于进行查询非常有用: