Список пользователей в определенной Active Directory Distribution Group

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

Обновление:

Вот эти два метода, которые я в настоящее время имею:

    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

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

7
задан Justin Helgerson 7 July 2010 в 21:43
поделиться

2 ответа

Если есть возможность, обновите до .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
 }
15
ответ дан 6 December 2019 в 11:45
поделиться

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

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))"
2
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: