Я пытаюсь получить список пользователей и некоторых свойств о пользователе из активной группы каталогов.
Обновление:
Вот эти два метода, которые я в настоящее время имею:
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
Количество результата, кажется, варьируется от каждого выполнения применения, которое я нахожу нечетными. Я не уверен - ли это надежный способ вернуть пользователей или если я должен изменить что-то на своем поиске?
Если есть возможность, обновите до .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
}
Расширьте область поиска, где бы ни находились участники:
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))"