【问题标题】:getting user details from AD is slow从 AD 获取用户详细信息很慢
【发布时间】:2011-10-31 15:01:03
【问题描述】:

我正在使用以下代码从特定部门获取有关员工的大量信息并从 AD 返回列表...

虽然它有效,但似乎很慢,是否有更有效的方法从 AD 获取各种用户详细信息?

public static List<Employee> GetEmployeeListForDepartment(string departpment)
        {
            using (HostingEnvironment.Impersonate())
            {

                PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain);
                GroupPrincipal gp = GroupPrincipal.FindByIdentity(ctx, departpment);
                PrincipalSearchResult<Principal> members = gp.GetMembers();
                List<Employee> employees = new List<Employee>();
                foreach (var member in members)
                {
                    var emp = CreateEmployee(member);
                    employees.Add(emp);
                }
                return employees.OrderBy(x => x.FirstName).ToList();
            }
        }

        private static Employee CreateEmployee(Principal member)
        {
            if (member != null)
            {
                DirectoryEntry de = (member.GetUnderlyingObject() as DirectoryEntry);
                if (de != null)
                {

                    string mobile = de.Properties.Contains("mobile") ? de.Properties["mobile"][0].ToString() : "";
                    string title = de.Properties.Contains("description") ? de.Properties["description"][0].ToString() : "";

//ETC ETC...
                    return new Employee { etc.. };

                }

            }
            return new Employee();
        }

【问题讨论】:

  • 您可以选择自己缓存结果。

标签: c# .net active-directory ldap


【解决方案1】:

您的问题是您正在使用 System.DirectoryServices.AccountManagement...虽然我讨厌这样说,但很遗憾这是事实。 AccountManagement 在后台工作的方式是它运行一个单独的 LDAP 查询来单独检索每个项目。因此,当您遍历成员时,它会通过 LDAP 为每个成员进行单独的回调。您想要做的是使用 System.DirectoryServices.DirectorySearcher 运行 LDAP 查询。

我的假设是,部门是一个组,这取决于你如何使用它。这是我将如何做到的。 (我的代码在 VB.Net 中......对不起)。确保为您的组获取完全限定的 DN,或提前查找并将其插入查询中。

Dim results = LDAPQuery("(memberOf=CN=Fully,OU=Qualified,DC=Group,DC=Distinguished,DC=Name)", New String() {"mobile", "description"})

Dim emps = (from c as System.DirectoryServices.SearchResult in results _
             Select New Employee() {.Name = c.Properties("description"), .Mobile = c.Properties("mobile")}).ToList()

Public Function LDAPQuery(ByVal query As String, ByVal attributes As String()) As SearchResultCollection
    'create directory searcher from CurrentADContext (no special security available)
    Dim ds As New DirectorySearcher(System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry())
    ds.PageSize = 1000

    'set filter string
    ds.Filter = query

    'specify properties to retrieve
    ds.PropertiesToLoad.AddRange(attributes)

    'get results
    Dim results As SearchResultCollection = ds.FindAll()

    Return results
End Function

【讨论】:

  • 虽然我在 C# 中需要它,但它帮助很大,而且现在速度更快。棘手的部分是获取组名的 FQDN。
【解决方案2】:

您应该能够直接使用 Active Directory API。

大部分都在“System.DirectoryServices”下可用

我没有任何代码可以完全满足您的需求,但我的博客上确实有一篇大约一年前的文章,展示了如何在 AD 中创建本地用户帐户,所有这些都使用获取用户信息所需的相同程序集。

http://shawtyds.wordpress.com/2010/12/08/a-little-bit-of-ldap-here-there/

注意:AD 然而,它的本质是缓慢的,所以如果你有一个大目录,你很可能无法获得更快的速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多