C # LDAP-запрос для получения всех пользователей в подразделении - PullRequest
4 голосов
/ 11 октября 2011

Я пытаюсь выполнить запрос LDAP, который вернет всех пользователей, принадлежащих к организационным единицам OU=Employees и OU=FormerEmployees, и я никуда не доберусь.

Я попытался выполнить поиск с использованием distinguishedName, но, похоже, он не поддерживает символы подстановки. Я знаю, что должен быть более простой способ, но мои поиски не дали никаких результатов

1 Ответ

10 голосов
/ 11 октября 2011

Если вы используете .NET 3.5 и новее, вы можете использовать PrincipalSearcher и принцип «запрос за примером» для поиска:

// create your domain context and define what container to search in - here OU=Employees
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=Employees,DC=YourCompany,DC=com");

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// that is still active
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.Enabled = true;

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
}

Если вы этого не сделалиуже - обязательно прочитайте статью MSDN Управление принципами безопасности каталогов в .NET Framework 3.5 , которая показывает, как наилучшим образом использовать новые функции в System.DirectoryServices.AccountManagement

Если вы предпочитаетеВ «старом» стиле .NET 2.0 вам нужно будет создать базу DirectoryEntry, соответствующую вашему подразделению, в которое вы хотите перечислить объекты, а затем вам нужно создать DirectorySearcher, который ищет объекты - что-то вроде этого:

// create your "base" - the OU "FormerEmployees"
DirectoryEntry formerEmployeeOU = new DirectoryEntry("LDAP://OU=FormerEmployees,DC=YourCompany,DC=com");

// create a searcher to find objects inside this container
DirectorySearcher feSearcher = new DirectorySearcher(formerEmployeeOU);

// define a standard LDAP filter for what you search for - here "users"    
feSearcher.Filter = "(objectCategory=user)";

// define the properties you want to have returned by the searcher
feSearcher.PropertiesToLoad.Add("distinguishedName");
feSearcher.PropertiesToLoad.Add("sn");
feSearcher.PropertiesToLoad.Add("givenName");
feSearcher.PropertiesToLoad.Add("mail");

// search and iterate over results
foreach (SearchResult sr in feSearcher.FindAll())
{
    // for each property, you need to check where it's present in sr.Properties
    if (sr.Properties["description"] != null && sr.Properties["description"].Count > 0)
    {
       string description = sr.Properties["description"][0].ToString();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...