Да, можно быстро загрузить настраиваемый атрибут для всех принципалов при первоначальном вызове FindAll(). Вам нужно только указать свои настраиваемые атрибуты, как описано в образце Microsoft, используя атрибут [DirectoryProperty("YOUR_PROP_NAME")].
Получив доступ к свойству PropertiesToLoad базового DirectorySearcher с помощью метода GetUnderlyingSearcher() класса UserPrincipal, вы увидите, что ваш настраиваемый атрибут включен в коллекцию свойств для загрузки. Вы можете проверить коллекцию PropertiesToLoad в отладчике.
На моей машине коллекция содержит в общей сложности 68 свойств.
И тут начинаются проблемы и штраф за производительность. Чем больше свойств включено в эту коллекцию, тем больше потребуется обращений к Active Directory для их извлечения.
Я сделал несколько тестов производительности:
Использование образца Microsoft для извлечения 200 объектов InetOrgPerson заняло около 500 мс.
Использование класса DirectorySearcher напрямую и запрос только интересующих свойств заняло всего 70 мс (см. пример ниже).
using (DirectoryEntry e = new DirectoryEntry("LDAP://server10/CN=users,DC=treyresearch,DC=net",
"treyresearch\\administrator", "P@$$W0rd", AuthenticationTypes.FastBind | AuthenticationTypes.Secure))
{
using (DirectorySearcher ds = new DirectorySearcher(e, "(&(objectCategory=inetorgperson)(logonCount=0))"))
{
ds.SearchScope = SearchScope.OneLevel;
ds.PropertiesToLoad.Clear();
ds.PropertiesToLoad.Add("logonCount");
ds.PropertiesToLoad.Add("sAMAccountName");
Stopwatch sw = new Stopwatch();
sw.Start();
int countPerson = 0;
using (SearchResultCollection searchResultCol = ds.FindAll())
{
foreach (SearchResult sr in searchResultCol)
{
ResultPropertyValueCollection propCol = sr.Properties["logonCount"];
if (propCol.Count > 0)
{
countPerson++;
object cou = propCol[0];
}
}
sw.Stop();
Console.Out.WriteLine(sw.ElapsedMilliseconds);
Console.Out.WriteLine(countPerson);
}
}
}
Точно так же я использовал objectCategory в фильтре поиска вместо objectClass, потому что objectCategory является так называемым индексированным свойством. Доступ к индексированным свойствам выполняется быстрее, чем доступ к неиндексированным свойствам.
Кроме того, я указал AuthenticationTypes.FastBind для повышения производительности.
Чтобы еще больше повысить производительность, см. эту статью на MSDN, в которой описывается создание эффективные поисковые запросы.
Подводя итог, можно сказать, что использование класса DirectorySearcher и указание только тех свойств, которые вас интересуют, значительно повышает производительность вашего поиска (уменьшая количество обращений к Active Directory).
Надеюсь это поможет.
person
Hans
schedule
07.09.2011