Невозможно быстро ответить на извлечение AD

Я разрабатываю приложение SharePoint, которому нужны пользователи из указанного организационного подразделения Windows Server 2003 Active Directory.

Во-первых, меня не беспокоили операции Dispose и Close над объектами DirectoryServices. На этом этапе операции извлечения были быстрыми и успешными.

Но это вызывало ошибку «Сервер не работает» после двух попыток. И эта ошибка ухудшает работу всего приложения, как и остановка других операций AD.

Затем я исправил эту ошибку, добавив операторы using во все объекты DirectoryEntry, DirectorySearcher и SearchResultCollection.

Затем я дошел до того, что больше не получаю ошибку «Сервер не работает». Но когда я пытаюсь получить пользователей из AD 1 или более раз с помощью метода DirectorySearcher.FindAll, первый работает быстро и успешно, другие - медленнее, но успешно. Это как бы занимает время тайм-аута. Не могли бы вы помочь мне с моей ситуацией по поводу этого замедления?

Вот пример кода:

using (DirectoryEntry directoryEntry = new DirectoryEntry(connectionString, userName, password))
            {
                using (DirectorySearcher search = new DirectorySearcher(directoryEntry))
                {
                    search.SearchScope = SearchLevel.OneLevel;
                    search.ReferralChasing = ReferralChasingOption.All;
                    search.Filter = filter;
                    search.SizeLimit = 200;
                    //Limits the property count for search result
                    SetUserDirectorySearcherPropertiesToLoad(search);

                    using (SearchResultCollection result = search.FindAll())
                    {
                        foreach (SearchResult searchResult in result)
                        {
                            // Get user attributes
                        }}}}

заранее спасибо


person Mlh    schedule 06.01.2010    source источник
comment
есть ли ошибки Schannel в журнале системных событий? Какая версия AD (2000, 2003 и т.д.)?   -  person DmitryK    schedule 06.01.2010
comment
AD работает на 2003. Средство просмотра событий в порядке.   -  person Mlh    schedule 06.01.2010


Ответы (1)


Здесь вроде все нормально. Я использую что-то похожее, единственное отличие состоит в том, что я обычно передаю параметр "propertiesToLoad" конструктору DirectoryEntry, а также передаю фильтр конструктору DirectorySearcher.

Другое отличие состоит в том, что вы используете «имя пользователя» и «пароль» для DirectoryEntry - может быть, стоит использовать идентификатор пула приложений? Обычно я делаю SPSecurity.RunWithElevatedPrivileges(method pointer) для этих звонков.

person naivists    schedule 06.01.2010
comment
Я пробовал оба способа, и это ни на что не повлияло. Удостоверение пула приложений не имеет необходимых привилегий в Active Directory, таких как добавление любого члена домена в любую группу. Поэтому мне нужно взять учетные данные из файла конфигурации. - person Mlh; 06.01.2010
comment
Вы можете опубликовать пример, как выглядят ваши переменные connectionString и filter? - person naivists; 06.01.2010
comment
Моя строка подключения - LDAP: // dcname / OU = ou1, OU = ou2, DC = dcname Мой фильтр: (& (& (ObjectClass = person)) (& (! MemberOf = CN = Students, OU = UEPOU, DC = lst, DC = local) (! memberOf = CN = Инструкторы, OU = UEPOU, DC = lst, DC = local) (! memberOf = CN = Директора, OU = UEPOU, DC = lst, DC = local) (! userAccountControl: 1.2.840.113556.1.4.803: = 2))) Я знаю, что это может показаться сложным, но эти переменные работают в браузере LDAP. - person Mlh; 06.01.2010
comment
Нет, с LDAP-запросами все в порядке. Я просто подумал, что запрос может быть слишком неопределенным, и вы получили очень много результатов. Но похоже, что это не так. ReferralChasing настроен на All намеренно? Я думаю, это может занять некоторое время. Однако это не объясняет, почему первое выполнение выполняется быстро, а второе - медленно. - person naivists; 06.01.2010
comment
Спасибо за совет. Я специально не устанавливаю свойство ReferralChasing. Это было наиболее распространенное свойство DirectorySearcher в образцах кода. Я попробую установить для свойства значение None и поищу результаты, когда приступлю к работе. - person Mlh; 07.01.2010
comment
Я просто попробовал то, что вы предлагаете, и операции Active Directory с операциями CRUD работают немного быстрее, чем обычно, но не в этой проблеме. Время ожидания все еще идет. Возможно, проблема возникает из-за последовательных операций в AD для запроса в моем приложении. Приложение использует не менее 5 соединений для 1 операции, которая состоит из вызовов, обновления объекта и внесения свойств объекта для одного и того же объекта. - person Mlh; 09.01.2010