Самая вопиющая проблема для меня заключается в следующем:
mySearcher.FindAll().Dispose();
Да, вы должны Dispose
из SearchResultCollection
, но вы должны использовать тот, который вы создали для цикла. Вызов FindAll()
во второй раз просто повторяет поиск. Тогда вы просто отбрасываете результаты и по-прежнему оставляете свой предыдущий SearchResultCollection
нераспределенным.
Вы должны использовать что-то вроде этого:
using (var results = mySearcher.FindAll()) {
foreach (SearchResult result in results) {
}
}
Внесение этого изменения должно ускорить процесс, поскольку оно удаляет ненужный вызов AD для каждой учетной записи.
Я нашел ваше повторное использование entry
немного странным, но я думаю, что это работает:)
Есть ли причина, по которой вы не включаете msds-memberOfTransitive
в PropertiesToLoad
? Это спасло бы еще один вызов в AD.
mySearcher.PropertiesToLoad.AddRange(new string[] { "cn", "displayName", "canonicalName", "userAccountControl", "distinguishedName", "msds-memberOfTransitive"});
...
//These lines no longer needed
//entry.Path = "LDAP://" + strUserDN;
//entry.RefreshCache(new string[] { "msds-memberOfTransitive" });
foreach (String strDN in result.Properties["msds-memberOfTransitive"]) {
...
}
Я вижу, что это новый атрибут в Windows Server 2012. У меня нет доступа к домену, который работает в 2012 году, поэтому я не могу проверить, работает ли он, поэтому, возможно, это не так. Но я знаю, что он вернет другие созданные атрибуты (например, canonicalName
), поэтому он должен работать.
Edit:
Кроме того - я не знаю, поможет ли это ускорить, но это поможет упростить ваш код - вместо использования lock(UserProfileDictionaryLock)
вы можете просто сделать UserProfileDictionary
a ConcurrentDictionary
, который предназначен для потокобезопасный.
Редактировать 2: Если это того стоит, вы можете фактически найти несколько учетных записей в одном запросе:
(&(samAccountType=805306368)(|(sAMAccountName=username1)(sAMAccountName=username2)(sAMAccountName=username3)))
Максимальная длина запроса LDAP, по-видимому, очень большая , но вы можете делать их партиями по 50 или даже 100 (или более?).
Таким образом, вы можете передать список имен пользователей вашему методу GetADInfo
вместо одного. Это может реально сократить количество подключений к AD.