2010-03-18 2 views
1

Вот что я пытаюсь сделать:Как я могу получить список всех пользователей, принадлежащих к определенному отделу из Active Directory?

Я хочу получить список всех пользователей и групп, принадлежащих определенному отделу (введенному пользователем) из Active Directory, используя VB.Net и DirectoryServices.

Любые предложения?

ответ

3

Пока вы работаете на .NET 2.0, это, вероятно, так хорошо, как и получается. Что вы можете сделать, это добавить «универмаги» критерии для поискового фильтра - таким образом, вы бы оставить его до нашей эры, чтобы сделать фильтрацию по отделам:

Private Sub GetUsersByDepartment(ByVal department as String) 
    Dim deGlobal As DirectoryEntry = New DirectoryEntry(ADPath, ADUser, ADPassword) 
    Dim ds As DirectorySearcher = New DirectorySearcher(deGlobal) 

    ds.Filter = "(&(objectCategory=person)(objectClass=user)(department=" & department & "))" 
    ds.SearchScope = SearchScope.Subtree 

    For Each sr As SearchResult In ds.FindAll 
    Dim newDE As DirectoryEntry = New DirectoryEntry(sr.Path) 
    If Not newDE Is Nothing Then 
      *Do Something* 
    End If 
    Next 
End Sub 

Это, безусловно, поможет - я надеюсь, что, как C#, я не испортил ваш код VB!

Фильтр LDAP в основном позволяет вам иметь любое количество условий внутри «андерного» кронштейна ((&....) вокруг ваших двух условий - вы можете легко расширить это до трех условий, как и я).

Если у вас есть возможность переместиться на .NET 3.5, есть новое пространство имен под названием System.DirectoryServices.AccountManagement, которое предлагает гораздо лучшие и более «интуитивные» подходы для обработки пользователей, групп, компьютеров и поиска.

Ознакомьтесь с статьей MSDN Managing Directory Security Principals in the .NET Framework 3.5, чтобы узнать больше об этом.

Что вы можете сделать, например, «Поиск по примеру», так что вы можете создать UserPrincipal и установить те свойства, которые вы хотите фильтровать, а затем выполнить поиск по этому объекту в качестве «шаблона» почти:

UserPrincipal user = new UserPrincipal(adPrincipalContext); 
user.Department = "Sales"; 

PrincipalSearcher pS = new PrincipalSearcher(user); 

PrincipalSearchResult<Principal> results = pS.FindAll(); 

// now you could iterate over the search results and do whatever you need to do 

Очень аккуратный, действительно! Но только на .NET 3.5, к сожалению .... но подождите - это всего лишь пакет обновления поверх .NET 2, действительно :-)

+0

Это работает как шарм, marc_s. Очень признателен! Поверьте мне, есть * несколько * особенностей .NET 3.5. Я бы хотел воспользоваться (это один из них). Я ценю улучшенное решение и быстрый совет по DirectoryServices. :) –

0

Ну, вот что я придумал. Кажется, что это работает, но я, безусловно, открыт для предложений или улучшенных решений.

Private Sub GetUsersByDepartment(ByVal department as String) 
    Dim deGlobal As DirectoryEntry = New DirectoryEntry(ADPath, ADUser, ADPassword) 
    Dim ds As DirectorySearcher = New DirectorySearcher(deGlobal) 

    ds.Filter = "(&(objectCategory=person)(objectClass=user))" 
    ds.SearchScope = SearchScope.Subtree 

    For Each sr As SearchResult In ds.FindAll 
    Dim newDE As DirectoryEntry = New DirectoryEntry(sr.Path) 
    If Not newDE Is Nothing Then 
     If newDE.Properties.Contains("department") Then 
     If newDE.Properties("department")(0).ToString = department Then 
      *Do Something* 
     End If 
     End If 
    End If 
    Next 

End Sub 
Смежные вопросы