Active directory LDAP从搜索中排除子OU
假设我的结构如下所示: 如何排除A和B2Active directory LDAP从搜索中排除子OU,active-directory,ldap,ldap-query,Active Directory,Ldap,Ldap Query,假设我的结构如下所示: 如何排除A和B2 _users |__A |__B |__B1 |__B2 |__B3 |__C |__D ou=用户,dc=域,dc=co,dc=uk LDAP搜索由4个元素组成: 请求从中开始搜索的节点(节点的名称) 搜索范围(基本、一级、子树) 搜索的筛选器(例如,(objectClass=user)) 要检索的属性 在Active Directory中,不存在从递归搜索中排除OU的“自然”方法。关于LDAP,从理论上讲,它允许您做您想做的事情,
_users
|__A
|__B
|__B1
|__B2
|__B3
|__C
|__D
ou=用户,dc=域,dc=co,dc=uk LDAP搜索由4个元素组成:
在Active Directory中,不存在从递归搜索中排除OU的“自然”方法。关于LDAP,从理论上讲,它允许您做您想做的事情,但它在Active Directory中。因为目录服务器不兼容(正如JP所指出的,AD不支持可扩展的匹配筛选器) 因此不符合),如果存在具有将条目标识为 属于
A
和B2
的,排除使用搜索筛选器的。例如,如果输入
从属于A
的objectClass
在-A中具有值,您的筛选器可以排除具有值的对象
由基本对象ou=users,dc=domain,dc=co,dc=uk
,scope整个子树组成的搜索,
筛选(!(objectClass=in-A))
,以及所需的属性列表。可以使用类似的过滤器
构造为同时排除A
和B2
中的条目
有关搜索和搜索筛选器的详细信息,请参阅 唯一的方法是仅在想要或不想要的OU上设置特殊属性。您可以为用户使用pager
属性,也可以为计算机使用physicalLocationObject,因为它们很少使用,并且在处理此类问题时通常会被“滥用”(别忘了确认它们是否真的未使用!!)。然后,您可以对这些属性进行搜索筛选,以排除这些属性,例如:(&(objectclass=user)(!(pager=*))
当然,这是低效的,正确的解决方案是重新排列LDAP/AD结构以满足需要。我可能过度简化了这一点,但您不能也拒绝对要从查询中排除的OU的列表/读取访问吗?假设您使用特定的服务帐户来执行查找,这应该会起作用。我正在做类似的事情。我首先使用搜索范围设置为“OneLevel”的“objectclass=organizationalunit”。代码如下所示:
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匹配,我将继续下一个结果。如果没有,那么我会采取一些措施。对于我来说,我需要轻松地从ldap搜索结果中排除禁用的用户,或者从任何其他可以显示这些用户帐户以及已启用(活动)帐户的内容中排除禁用的用户。我拒绝了禁用用户OU的列表内容访问,使OU可见,但内容不可见。其结果是,人们在使用Contacts应用程序的绑定Mac客户端上搜索时,将不再看到“ghost”用户。做了类似于什么的事情?一般来说,答案应该是独立的,引用并链接到他们使用的任何其他答案或外部资源。对于我来说,使用Ad排除DiscriminatedName路径是有效的: