带有活动目录用户的自动完成文本框

本文关键字:文本 活动 用户 | 更新日期: 2023-09-27 18:32:22

嗨,我正在尝试创建一个文本框,当用户在其中键入时,他们会获得具有特定名称的用户列表:

示例:如果我开始键入 Jane.Doe,并且我只输入了 Ja,则会出现一个列表,其中包含来自 Active Directory 的用户,这些用户以 Ja 开头。我需要弄清楚如何在用户每次键入时将用户添加到列表。我几乎已经完成了阿贾克斯方面。它只是每次更新用户列表。

我目前的想法:

 [HttpPost]
    public ActionResult RemoteData(string query)
    {
        List<string> lstADUsers = new List<string>();
        using (var context = new PrincipalContext(ContextType.Domain, null, "LDAPPATH"))
        {
            using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
            {
                foreach (var result in searcher.FindAll())
                {
                    DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                    string usersWithName;

                    if (!String.IsNullOrEmpty((String)de.Properties["samaccountname"].Value))
                    {
                        usersWithName = de.Properties["samaccountname"].Value.ToString();

                        lstADUsers.Add(usersWithName);
                    }
                }
            }
        }
        List<string> listData = null;
        if (!string.IsNullOrEmpty(query))
        {
            listData = lstADUsers.Where(q => q.ToLower().StartsWith(query.ToLower())).ToList();
        }   
        return Json(new { Data = listData });
    }

因此,这使我们能够在Active Directory中获取每个用户,但我不希望这样做,因为手头的问题是用户太多,搜索在显示名称列表之前需要很长时间才能加载它。我只希望能够采用一个参数,并且只搜索以该参数开头的用户。我将如何做到这一点?

带有活动目录用户的自动完成文本框

您需要使用通配符填充 UserPrincipalName 属性以限制结果集:

// assume 'query' is 'Ja'
UserPrincipal user = new UserPrincipal(context);
user.Name = query + "*"; // builds 'Ja*', which finds names starting with 'Ja'
using (var searcher = new PrincipalSearcher(user))
// ...