Как получить список всех пользователей, принадлежащих к определенному отделу, из Active Directory? - PullRequest
1 голос
/ 18 марта 2010

Вот что я пытаюсь сделать:

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

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

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

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 Управление принципами безопасности каталогов в .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 голосов
/ 18 марта 2010

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

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
...