Допустим, у меня есть настройка леса со многими доменами. Если бы мне пришлось выбрать произвольную группу безопасности из любого из доменов, как лучше всего найти ВСЕХ членов этой группы, включая членов пользователей из вложенных групп? Я хочу иметь возможность делать это независимо от типа группы (например, универсальная, глобальная или локальная в домене). Насколько я понимаю, мы не можем использовать только глобальный каталог, потому что члены группы не реплицируются туда для всех типов групп.
В конечном итоге мы сделаем это с помощью кода, но пока я просто хочу понять процесс. Для простоты предположим, что я уже знаю objectGUID стоимость. Были бы шаги высокого уровня:
Запросите любой глобальный каталог в лесу для группы (через objectGUID) и получить домен, в котором определена группа, через его objectCategory атрибут выдающееся имя
Выполните запрос к контроллеру домена, в котором определена группа (получена на шаге 1), используя objectGUID и memberOf: 1.2.840.113556.1.4.1941 как фильтр
Есть ли еще что-нибудь? Существуют ли крайние случаи, когда мне нужно будет запросить дополнительные контроллеры домена (например, дополнительные поддомены)? Есть ли другие случаи, когда мне не пришлось бы идти дальше глобального каталога, потому что тип группы (или какой-либо другой атрибут) гарантирует, что вся информация о ее членах реплицируется в глобальном каталоге?
РЕДАКТИРОВАТЬ
Поиск по memberOf
не даст вам всех результатов, поскольку вы найдете пользователей только в рамках вашего поиска (например, если вы выполняете поиск в одном домене, вы найдете только пользователей в этом домене, даже если в группе есть участники из других доменов).
Авторитетный список членов группы находится в member
атрибут самой группы. В member
атрибут содержит distinguishedName
всех членов группы. В member
атрибут реплицируется в глобальный каталог (только для универсальных групп), однако AD дает вам только 1500 участников одновременно. Для любых групп, у которых есть больше, вам нужно попросить больше.
Если вы планируете начать с objectGuid
, то вы можете напрямую привязаться к объекту, используя это. Вам вообще не нужно искать. Вы используете эту нотацию для привязки к объекту с GUID:
LDAP://<GUID={guid}>
где {guid}
- это строковый GUID. Затем вы читаете member
атрибут.
Если в группе есть участники из других доменов, это может немного усложнить ситуацию, если домен не находится в том же лесу. В этих случаях member
Атрибут группы будет содержать объект в том же домене группы, который называется «участник внешней безопасности», который содержит SID фактической учетной записи во внешнем домене. Если вы хотите получить информацию об этой учетной записи (например, имя или адрес электронной почты), вам необходимо использовать эту информацию для подключения к внешнему домену для получения этой информации.
AD также имеет представление о «основных группах», которые различны, но вам, возможно, не стоит об этом беспокоиться. Я написал об этом статью под названием Что делает участника участником?.
Я также написал статью с примером кода на C # о поиск всех членов группы, в том числе следующие Принципы внешней безопасности. Даже если вы не планируете использовать C #, все равно LDAP работает в фоновом режиме, поэтому те же результаты можно воспроизвести на другом языке.