Список пользователей в определенной группе рассылки Active Directory - PullRequest
7 голосов
/ 07 июля 2010

Я пытаюсь получить список пользователей и некоторые свойства пользователя в активной группе каталогов.

Обновление:

Вот дваметоды, которые у меня сейчас есть:

    Dim adGroup As New DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com")
    Dim adMembers As Object
    Dim objUser As ActiveDirectoryUser
    Dim objUserList As New List(Of ActiveDirectoryUser)
    Dim directoryEntry As DirectoryEntry

    adMembers = adGroup.Invoke("Members", Nothing)

    For Each adMember As Object In CType(adMembers, IEnumerable)
        directoryEntry = New DirectoryEntry(adMember)
        objUser = New ActiveDirectoryUser

        objUser.UserId = directoryEntry.Properties.Item("sAMAccountName").Value.ToString()
        objUser.Contract = directoryEntry.Properties.Item("ou").Value.ToString()
        objUser.LastName = directoryEntry.Properties.Item("sn").Value.ToString()
        objUser.FirstName = directoryEntry.Properties.Item("givenName").Value.ToString()
        objUser.Email = directoryEntry.Properties.Item("mail").Value.ToString()

        objUserList.Add(objUser)
    Next

Первая часть работает, хотя кажется, что она неэффективна.Мое использование памяти поднимается и поднимается по мере выполнения, и я получаю эту ошибку, хотя, похоже, это можно исправить.Второй метод:

    Dim results As SearchResultCollection
    Dim directoryEntry2 As New DirectoryEntry("LDAP://DC=domain,DC=com")
    Dim directorySearcher As New DirectorySearcher(directoryEntry2)
    directorySearcher.PageSize = 1000

    directorySearcher.Filter = "(&(objectCategory=person)" & _
                           "(objectClass=user)" & _
                           "(memberOf=CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com))"


    directorySearcher.PropertiesToLoad.Add("ou")
    directorySearcher.PropertiesToLoad.Add("sn")
    directorySearcher.PropertiesToLoad.Add("givenName")
    directorySearcher.PropertiesToLoad.Add("sAMAccountName")
    directorySearcher.PropertiesToLoad.Add("mail")

    results = directorySearcher.FindAll

Количество результатов, кажется, зависит от каждого выполнения приложения, которое я нахожу странным.Я не уверен, что это надежный способ вернуть пользователей или мне нужно что-то изменить в моем поиске?

Ответы [ 2 ]

15 голосов
/ 07 июля 2010

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

. С этим ваша работа становится тривиальной:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "MyGroup");
PrincipalSearchResult<Principal> members = group.GetMembers();

это работает для вас?

Если вы не можете использовать .NET 3.5, вы должны проверить свойство member группы.Члены группы не хранятся как дочерние элементы логически под группой в иерархии, поэтому вы не можете найти их, используя DirectorySearcher.

DirectoryEntry group = new DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com");

foreach(object groupMemberDN in group.Properties["member"])
{
   // grab the group member's DN
}

См. Быстрый списокПримеры кода C # для Active Directory (или то же самое для Visual Basic .NET ) в библиотеке MSDN для этого фрагмента и т. Д.

Обновление: есливам нужно, чтобы пользователи принадлежали к определенной группе (поскольку вы хотите обновить их свойства или что-то в этом роде), вы можете изменить подход: искать всех пользователей, у которых свойство memberOf эквивалентно DN группы:

 DirectoryEntry root = new DirectoryEntry("LDAP://dc=domain,dc=com");
 DirectorySearcher searcher = new DirectorySearcher(root);

 searcher.Filter = "(&(objectCategory=user)(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))";
 // set other properties on the searcher

 foreach(object result in searcher.FindAll())
 {
    // do whatever you need to do with the entry
 }
2 голосов
/ 07 июля 2010

Расширяйте область поиска, где бы ни находились участники:

Dim directoryEntry As New DirectoryEntry("LDAP://OU=All,DC=Domain,DC=com")

Фильтр на основе членства в группе:

directorySearcher.Filter = "(&(objectCategory=person)" & _
                             "(objectClass=user)" & _
                             "(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...