Этот фрагмент (внутри цикла, который выполнялся 31 раз) занял 00:01:14.6562500 (1 минуту и 14 секунд). :
Код: Выделить всё
SearchResult data = searcher.FindOne();
System.Diagnostics.Trace.WriteLine(PropsDump(data));
Код: Выделить всё
searcher.SizeLimit = 1;
SearchResultCollection coll = searcher.FindAll();
foreach (SearchResult data in coll)
{
System.Diagnostics.Trace.WriteLine(PropsDump(data));
}
На самом деле следующий вопрос представляет собой другой вопрос, но он дает некоторое представление о том, почему я вообще использую цикл:
Я хотел получить все свойства в один единственный запрос, но я не могу заставить DirectorySearcher вернуть все нужные свойства за один раз (он пропускает около 30% свойств, указанных в PropertiesToLoad (также пробовал установить его в конструкторе, но это не имеет значения), я обнаружил, что у кого-то другого было та же проблема, и это его решение (перебирать их). Когда я просматриваю их таким образом, используя FindOne() или FindAll(), я получаю все свойства, но на самом деле все это похоже на обходной путь.
Я что-то упустил?
Изменить:
Похоже, проблема заключалась в том, как я получил первую запись DirectoryEntry, для которой использовал DirectorySearcher.
Это было код, из-за которого DirectorySearcher возвращал только некоторые свойства:
Код: Выделить всё
private static DirectoryEntry GetEntry() {
DirectoryContext dc = new DirectoryContext(DirectoryContextType.DirectoryServer, "SERVERNAME", "USERNAME", "PASSWORD");
Forest forest = Forest.GetForest(dc);
DirectorySearcher searcher = forest.GlobalCatalogs[0].GetDirectorySearcher();
searcher.Filter = "OU=MyUnit";
searcher.CacheResults = true;
SearchResultCollection coll = searcher.FindAll();
foreach (SearchResult m in coll)
{
return m.GetDirectoryEntry();
}
throw new Exception("DirectoryEntry not found");
}
Код: Выделить всё
private static DirectoryEntry GetEntry2()
{
return new DirectoryEntry(@"LDAP://SERVERNAME/OU=MyUnit,DC=SERVERNAME,DC=local", "USERNAME", "PASSWORD");
}
Итак, кажется, что два разных экземпляра одного и того же DirectoryEntry может давать разные результаты в зависимости от способа его создания... немного жутковато!
Редактировать
Использовал JetBrains DotPeek, чтобы посмотреть на реализацию. Функция FindOne запускается следующим образом:
Код: Выделить всё
public SearchResult FindOne()
{
SearchResult searchResult1 = (SearchResult) null;
SearchResultCollection all = this.FindAll(false);
...
Код: Выделить всё
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public SearchResultCollection FindAll()
{
return this.FindAll(true);
}
private SearchResultCollection FindAll(bool findMoreThanOne)
{
... // other code
this.SetSearchPreferences(adsSearch, findMoreThanOne);
Подробнее здесь: https://stackoverflow.com/questions/185 ... all-and-wh