Вы не можете сделать это с помощью UserPrincipal
, а PrincipalSearcher
позволит вам искать только по свойствам, предоставленным UserPrincipal
. Вы должны использовать DirectorySearcher
напрямую (что и PrincipalSearcher
все равно использует за кулисами).
Вот пример того, что вы могли бы сделать:
public IEnumerable<string> GetUsersWithManager(string managerDn) {
var search = new DirectorySearcher(new DirectoryEntry()) {
Filter = $"(&(objectClass=user)(manager={managerDn}))"
};
search.PropertiesToLoad.Add("distinguishedName");
using (var results = search.FindAll()) {
foreach (SearchResult result in results) {
if (result.Properties.Contains("mail")) {
yield return (string) result.Properties["distinguishedName"][0];
}
}
}
}
Параметр представляет собой distinguishedName
менеджера и возвращает distinguishedName
всех пользователей, у которых этот человек является их менеджером (атрибут manager
содержит DN учетной записи менеджера). Возможно, вам придется настроить его для ваших нужд.
Если вам нужен объект UserPrincipal
для результирующих пользователей, вы можете сделать это с помощью этого (где переменная distinguishedName
— это DN пользователя):
UserPrincipal.FindByIdentity(context, IdentityType.DistinguishedName, distinguishedName)
Просто имейте в виду, что атрибут manager
не является проиндексировано. Так что, если это ваш единственный критерий (помимо (objectClass=user)
), то AD нужно просмотреть каждого пользователя, чтобы найти совпадения. Это может или не может быть очень медленным в вашей среде.
Лично я предпочитаю использовать DirectorySearcher
и DirectoryEntry
напрямую. Я считаю, что все пространство имен System.DirectoryServices.AccountManagement
очень медленное. Я написал статью о том, как повысить производительность с помощью пространства имен System.DirectoryServices
напрямую: Active Directory: лучшая производительность
person
Gabriel Luci
schedule
25.02.2019