Получение списка пользователей косвенно членами группы AD через LDAP

У меня есть небольшая проблема с поиском LDAP, которая должна указывать, является ли пользователь членом данной группы AD или нет (рекурсивно).

По сути, я делаю поиск LDAP со следующими параметрами:

get-aduser -LDAPFilter "(memberof:1.2.840.113556.1.4.1941:={group LDAP path})" -SearchBase "{AD LDAP base}"

Это дает ожидаемый результат: вместо того, чтобы получить всех пользователей, которые прямо или косвенно являются членами группы, которую я ищу, я получаю всех прямых членов этой группы, а также случайный выбор косвенных членов (членов групп, которые являются участниками разыскиваемой группы).

Список, который я получаю, кажется произвольным: я не могу найти никакой разницы в членстве в группе между двумя пользователями, которые должны присутствовать в наборе результатов, но один есть, а другой нет.

(Мне нужно решить эту проблему с помощью поиска LDAP, потому что результат будет использоваться в приложении, а не через powershell. Но используя powershell таким образом, я могу воспроизвести исходную проблему описанным способом).

2 ответа

Используйте Get-ADGroupMember с ключом -Recursive, чтобы получить список всех членов, которые не содержат дочерних объектов. Это будет погружаться в участников, которые имеют дочерний объект, чтобы получить их участников.

пример

$groupName = "Domain Admins"
$group = Get-ADGroup $groupName
$groupMembers = Get-ADGroupMember $group -Recursive

Вам нужно запрашивать группу вместо пользователей, потому что memberOf может давать противоречивые результаты из-за того, что пользователи являются членами вложенных групп / ролей / и т. Д.

Получаете ли вы тот же результат с get-adobject (вместо get-aduser)?
Или попробуйте использовать объект.NET Directory Searcher

$rootDSE = [adsi]"LDAP://RootDSE"
$dnDomain = $rootDSE.defaultNamingContext
$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$search.searchroot = [adsi]"LDAP://$dnDomain"
$search.Filter = "(&(objectClass=user)(memberof:1.2.840.113556.1.4.1941:={group LDAP path}))"
$search.findAll()
Другие вопросы по тегам