Службы каталогов 400 000 пользователей экспортируют запросы - PullRequest
0 голосов
/ 08 марта 2011

Я написал приложение, которое будет экспортировать всех пользователей из Active Directory и записывать их в базу данных.проблема в том, что в Active Directory с 20 000 пользователей этот метод ниже работает просто отлично, но в Active Directory с 400 000 он застревает, пока не сломается.Я определил размер страницы, но это не помогает.Как я могу решить эту проблему?

public List<string> GetAllUsers()
{
    List<string> AllUsers = new Lists<string>();

    DirectoryEntry deDomain = new DirectoryEntry("LDAP//xxxxx.xxxx,username,password);
    DirectorySearcher dsSercher = new DirectorySearcher(deDomain);

    dsSearcher.filter = "(objectclass=user)";
    dsSearcher.PropertiesToLoad.Add("cn");
    dsSearcher.PropertiesToLoad.Add("objectclass");
    dsSearcher.PageSize = 1000;

    SearchResultCollection srcResults = dsSearcher.FindAll();

    foreach (SearchResult currResult in srcResults)
    {
        if (currResult.Properties["objectclass"].Count == 4 &&
            currResult.Properties["objectclass"][0].ToString() == "top" && 
            currResult.Properties["objectclass"][0].ToString() == "person" && 
            currResult.Properties["objectclass"][0].ToString() == "organizationalPerson" && 
            currResult.Properties["objectclass"][0].ToString() == "user")
            {
               AllUsers.Add(currResult.Properties["cn"][0].ToString());
            }
    }
    return (AllUsers);
}

Спасибо.

1 Ответ

0 голосов
/ 08 марта 2011

Предполагая, что предикаты в вашем операторе if когда-либо оценятся как true, вы сохраняете список всех 400 000 пользователей в памяти.Здесь будет много пейджинга.Кроме того, если для List требуется непрерывная память, то, вероятно, вы ее не получите.

Попробуйте преобразовать функцию в yield return.

Кроме того, отправьте сообщениена форуме программирования для других ответов.Это SuperUser.

РЕДАКТИРОВАТЬ: я использовал Google , чтобы найти это .Похоже, что FindAll буквально находит все , PageSize является внутренним для операции.

...