получение сведений о пользователе из AD происходит медленно - PullRequest
8 голосов
/ 31 октября 2011

Я использую следующий код, чтобы получить кучу информации о сотрудниках из определенных отделов и вернуть список из 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 ]

10 голосов
/ 01 ноября 2011

Ваша проблема в том, что вы используете System.DirectoryServices.AccountManagement ... Хотя я ненавижу это говорить, к сожалению, это правда. Внутреннее управление AccountManagement заключается в том, что он выполняет отдельный запрос LDAP для отдельного извлечения каждого элемента. Поэтому, когда вы перебираете членов, он делает отдельный обратный вызов через LDAP для каждого участника. Вместо этого вы хотите выполнить запрос LDAP с помощью System.DirectoryServices.DirectorySearcher.

Я предполагаю, что отдел - это группа, основанная на том, как вы ее используете. Вот как бы я это сделал. (мой код в 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
0 голосов
/ 01 ноября 2011

Вы должны иметь возможность напрямую использовать API-интерфейс Active Directory.

Большинство из них доступно в разделе «System.DirectoryServices»

У меня нет кода для выполнения именно того, что вам нужно, но у меня есть статья в моем блоге около года назад, которая показывает, как создавать учетные записи локальных пользователей в AD, все из которых используют те же сборки, что и для получения информации о пользователе.

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

ПРИМЕЧАНИЕ: AD по своей природе медленный, поэтому есть большая вероятность, что вы не сможете получить его быстрее, если у вас большой каталог.

...