Я пытаюсь запустить фильтр LDAP, чтобы вернуть всех пользователей в группе. Довольно просто, и есть сотни вопросов о переполнении стека, которые уже содержат примеры запросов. Однако тот, который я использую, является базовым и ничего не возвращает при запуске в Powershell.
Что я пробовал
Get-ADUser -LDAPFilter "(&(objectclass=user)(objectcategory=person)(memberOf=CN=MyGroup,OU=Users,DC=MyDomain,DC=com))"
Я также пробовал "CN = Users" вместо "OU = Users
Где MyGroup находится в OU:
«МойДомен» (Лес) > «Пользователи» (ОУ) > «Моя группа» (CN)
Есть идеи, что я делаю не так, и почему ни один из 100-200 членов "MyGroup" не возвращается?
Первое, что я сделаю, это дважды проверим правильность DN группы, которую вы пытаетесь сопоставить. Обычно я делал что-то вроде этого:
(Get-ADGroup MyGroup).distinguishedName
# optionally, save it to a variable
$groupDN = (Get-ADGroup MyGroup).distinguishedName
Get-ADUser
будет ограничивать ваши результаты только пользовательскими объектами, поэтому вы можете опустить части objectclass / objectcategory фильтра LDAP и просто включить часть memberOf. Вы можете использовать переменную DN, которую мы установили ранее, вот так:
Get-ADUser -LDAPFilter "(memberOf=$groupDN)"
В этом конкретном запросе важно отметить, что он вернет только тех пользователей, которые являются прямыми членами группы. Он не вернет вложенные члены. Таким образом, если один из членов группы является другой группой, члены этой второй группы не будут отображаться в результатах без дополнительных усилий. Вы можете получить эти вложенные члены, настроив фильтр следующим образом:
Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$groupDN)"
Это сумасшедшее число с точками посередине - это OID, называемый LDAP_MATCHING_RULE_IN_CHAIN. Из документов:
LDAP_MATCHING_RULE_IN_CHAIN - это OID правила сопоставления, предназначенный для предоставления метода для поиска происхождения объекта. Многие приложения, использующие AD и AD LDS, обычно работают с иерархическими данными, которые упорядочены отношениями родитель-потомок. Раньше приложения выполняли транзитивное расширение группы для определения членства в группе, которое использовало слишком большую пропускную способность сети; приложениям необходимо было совершить несколько обходов, чтобы выяснить, упал ли объект «в цепочку», если ссылка пройдена до конца.
Другая причина, по которой ваш запрос может не возвращать результаты, заключается в том, что пользователь, выполняющий запрос, по какой-то причине не имеет доступа на чтение для некоторых / всех пользователей.
Get-ADUser -properties memberof -filter * | где -Property memberof -Contains ("CN = MyGroup, OU = Users, DC = MyDomain, DC = com")