Мне интересно, есть ли способ прочитать дополнительные свойства / атрибуты объявлений из Principal
Вы бы использовали возвращаемый объект DirectoryEntry
с Principal.GetUnderlyingObject
:
Principal match = principalSearcher.FindOne();
var de = (DirectoryEntry) match.GetUnderlyingObject();
de.RefreshCache(new string[] {"someAttribute"});
var someAttribute = de.Properties["someAttribute"].Value;
После этого вы вернетесь в AD, чтобы получить атрибуты, вместо использования данных, которые были получены при поиске.Использование RefreshCache
состоит в том, чтобы указывать только те атрибуты, которые вас интересуют. Иначе, если вы сразу используете DirectoryEntry.Properties
, он отправится в AD и получит все атрибуты, имеющие значение , что маловероятно, что вам нужно, и просто займет дополнительное время без причины.
Кроме того, в приведенном ниже коде могут возникнуть некоторые проблемы, поскольку мы используем лежащие в основе методы (DirectorySearcher).
Совсем нет.Этот код ничем не отличается от простого создания собственного DirectorySearcher
и его использования.Фактически, с тем, как вы написали этот код, нет никакого смысла вообще использовать UserPrincipal
/ PrincipalSearcher
.Единственное, что он для вас делает, это строит строку запроса.
Все пространство имен AccountManagement
- это просто оболочка вокруг DirectoryEntry
/ DirectorySearcher
.Это облегчает работу программиста (в некоторых случаях не всех), но делает это за счет производительности.
Если вы непосредственно используете DirectoryEntry
/ DirectorySearcher
, у вас гораздо больше контролясколько данных извлекается из AD и как часто выполняются сетевые запросы.Те переводят на меньшее время.Если вы просто ищете одну учетную запись, это не будет иметь большого значения.Но если вы ищете большие группы пользователей или просматриваете большой список пользователей, это может иметь огромное значение.
Я написал статью об оптимизации производительности при общении с AD (особенно с * 1041).* / DirectorySearcher
): Active Directory: лучшая производительность