Получить UserPrincipal от employeeID

Я внедрил System.DirectoryServices.AccountManagement для проверки подлинности в моем webapps, нахождении пользователей (UserPrincipal) byidentity, с учетом имени пользователя. Тем не менее, у меня есть несколько случаев, когда мне нужно получить учетные записи AD только с идентификатором employeeID. Есть ли хороший способ получить UserPrincipal (или даже имя sAMAccountName) с учетом идентификатора employeeID в AccountManagement?

В настоящее время я работаю над тем, чтобы захватить пользователей по имени пользователя:

PrincipalContext adAuth = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
//get user
UserPrincipal usr = UserPrincipal.FindByIdentity(adAuth, username);

Я искал и не могу найти ответы, чтобы подтвердить, может ли это быть или не может быть сделано. Если я не могу сделать это с помощью AccountManagement, какой лучший способ получить sAMAccountName с учетом employeeID?

2 ответа

Вам не нужно выходить за пределы пространства имен System.DirectoryServices.AccountManagement.

UserPrincipal searchTemplate = new UserPrincipal(adAuth);
searchTemplate.EmployeeID = "employeeID";
PrincipalSearcher ps = new PrincipalSearcher(searchTemplate);
UserPrincipal user = (UserPrincipal)ps.FindOne();

В этом примере, если пользователь не найден, пользовательский объект будет иметь значение null. Если вы хотите найти коллекцию объекта UserPrinicipal, вы можете использовать метод FindAll для объекта PrincipalSearcher (ps).

Также обратите внимание, что метод FindOne возвращает объект Principal, но мы знаем, что это действительно UserPrincipal, и его следует обрабатывать (отливать) как таковой, поскольку UserPrincipal является частью фильтра поиска.


Итак, я нашел способ использовать System.DirectoryServices, как показано ниже, но он выглядит довольно длинным:

string username = "";
DirectoryEntry entry = new DirectoryEntry(_path);
//search for a DirectoryEntry based on employeeID
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(employeeID=" + empID + ")";
//username
search.PropertiesToLoad.Add("sAMAccountName");
SearchResult result = search.FindOne();
//get sAMAccountName property
username = result.Properties["sAMAccountName"][0].ToString();

Конечно, я мог бы использовать это для других атрибутов, но мне очень нравятся сильно типизированные атрибуты с AccountManagement.

licensed under cc by-sa 3.0 with attribution.