从AD获取用户详细信息很慢

时间:2011-10-31 15:01:04

标签: c# .net active-directory ldap

我使用以下代码从特定部门获取有关员工的大量信息,并从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();
        }

2 个答案:

答案 0 :(得分:10)

你的问题是你正在使用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

答案 1 :(得分:0)

您应该可以直接使用Active Directory API。

大部分内容都在'System.DirectoryServices'

下提供

我没有任何代码可以完全按照您的需要进行操作,但是大约一年前我的博客上有一篇文章,其中显示了如何在AD中创建本地用户帐户,所有这些都使用了获取用户信息所需的相同程序集。

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

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

相关问题