FindOne()
находит только один.Если вам нужно увидеть больше, вам нужно будет использовать FindAll()
.Просто убедитесь, что вы обернули результат в оператор using
, так как в документации говорится, что у вас могут быть утечки памяти, если вы этого не сделаете:
using (var results = dirSearcher2.FindAll()) {
foreach (SearchResult searchResult2 in results) {
//do stuff
}
}
Если вы хотите тольконайти 2 (например, если вам нужно только узнать, существует ли более одного), тогда вы можете установить для свойства SizeLimit
вашего DirectorySearcher
значение 2
:
dirSearcher2.SizeLimit = 2;
Примечание об эффективности: когда вы используете .GetDirectoryEntry()
, а затем получаете свойства от объекта DirectoryEntry
, DirectoryEntry
фактически возвращается в AD для получения этих атрибутов, даже если вы уже получили их во время поиска.Вы уже использовали PropertiesToLoad
для запроса этих атрибутов, поэтому они уже доступны в вашем SearchResult
объекте.Просто имейте в виду, что все атрибуты в Properties
списке SearchResult
представлены как массивы, поэтому вам всегда нужно использовать [0]
, даже если они являются однозначными атрибутами в AD.
if (searchResult2.Properties.Contains("description")) {
desc = searchResult2.Properties["description"][0];
}
Если также необходимо убедиться, что вы ищете в Глобальном каталоге, который будет возвращать результаты со всех доменов в вашем лесу.Вы делаете это, создавая DirectoryEntry
, который вы используете для SearchRoot
с GC://
вместо LDAP://
.Это говорит о том, что он должен использовать порт 3268 (порт GC), а не порт LDAP по умолчанию (389).Вы создаете этот объект в вашем методе CreateDirectoryEntry()
.