Скажем, если бы у меня была структура, подобная следующей:
Как я могу исключить A и B2?
_users
|__A
|__B
|__B1
|__B2
|__B3
|__C
|__D
ou=пользователи, dc=домен, dc=co, dc=uk;
Скажем, если бы у меня была структура, подобная следующей:
Как я могу исключить A и B2?
_users
|__A
|__B
|__B1
|__B2
|__B3
|__C
|__D
ou=пользователи, dc=домен, dc=co, dc=uk;
Поиск LDAP состоит из 4 элементов:
В Active Directory не существует «естественного» способа исключить OU из рекурсивного поиска. Что касается LDAP, с теоретической точки зрения существует ExtensibleMatch, который позволяет делать то, что вы хотите, но он не поддерживается в Active- Каталог.
Я делаю нечто подобное. Сначала я использую поиск «objectclass=organizationalunit» с областью поиска, установленной на «OneLevel». Код выглядит примерно так:
DirectoryEntry oDE = new DirectoryEntry("LDAP://DC=ChildDomain,DC=RootDomain")
using (DirectorySearcher ds = new DirectorySearcher(oDE))
{
ds.PropertiesToLoad.Add("dn");
ds.SearchScope = SearchScope.OneLevel;
ds.Filter = "(objectClass=OrganizationalUnit)";
ds.PageSize = 30;
Затем я использую цикл foreach для циклического просмотра результатов и сравнения отличительного имени каждого результата с тем OU, который я исключаю. Если DN OU совпадает, я перехожу к следующему результату. Если нет, то я приму меры.
Мне нужно было легко исключить отключенных пользователей из результатов поиска ldap или чего-либо еще, что показывало бы эти учетные записи пользователей наряду с включенными (активными) учетными записями. Я запретил доступ к содержимому списка для OU Disabled Users, в результате чего OU остается видимым, а содержимое — нет. В результате люди, выполняющие поиск, скажем, из привязанных клиентов Mac с помощью приложения «Контакты», больше не будут видеть «призрачных» пользователей.
Поскольку сервер каталогов не соответствует требованиям (как отмечает JP, AD не поддерживает расширяемые фильтры соответствия и, следовательно, не соответствует требованиям), если есть атрибуты со значениями, идентифицирующими записи как принадлежащие A
и B2
, исключите те, у которых есть фильтр поиска. . Например, если записи, подчиненные A
, имеют objectClass
со значением in-A
, ваш фильтр может исключить те, поиск которых состоит из базового объекта ou=users, dc=domain, dc=co, dc=uk
, области действия whole subtree
, фильтра (!(objectClass=in-A))
и списка требуемых атрибутов. Аналогичный фильтр можно создать для одновременного исключения записей из A
и B2
.
Дополнительные сведения о поиске и поисковых фильтрах см. в разделе LDAP: освоение поисковых фильтров а>.
Единственный способ — установить специальный атрибут только для OU wanted или not-wanted. Вы можете использовать pager
атрибут для пользователя или PhysicalLocationObject для компьютера, так как они мало используются и обычно могут «злоупотреблять» для решения проблем такого рода (не забудьте подтвердить, что они действительно не используются или нет!! ). Затем вы можете выполнить поиск, отфильтровав эти атрибуты, чтобы исключить эти подразделения, например: (&(objectclass=user)(!(pager=*)))
Конечно, это неэффективно, и правильное решение — переупорядочить структуру LDAP/AD в соответствии с потребностями.
Я могу слишком упростить это, но не могли бы вы также просто запретить доступ к списку/чтению для OU, которые вы хотели бы исключить из запроса? Предполагая, что вы используете конкретную учетную запись службы для выполнения поиска, это должно работать.