假设我有如下结构:
如何排除 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 个元素组成:
(objectClass=user)
)在 Active Directory 中,不存在从递归搜索中排除 OU 的“自然”方式。
关于 LDAP,从理论上讲,ExtensibleMatch存在并启用您想要做的事情,但Active Directory不支持它。
我正在做类似的事情。我首先使用搜索范围设置为“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 进行比较。如果 OU 的 dn 匹配,我继续下一个结果。如果没有,那么我采取一些行动。
对我来说,我需要轻松地从 ldap 搜索结果或任何其他会显示这些用户帐户以及启用(活动)帐户的内容中排除禁用用户。我拒绝了 Disabled Users OU 的列表内容访问权限,这使 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 上设置特殊属性。您可以将pager
属性用于用户,或将物理位置对象用于计算机,因为它们很少使用并且通常可以被“滥用”来管理此类问题(不要忘记确认它们是否真的未使用!! )。然后,您可以搜索过滤这些属性以排除那些 OU,例如:(&(objectclass=user)(!(pager=*)))
当然,这是低效的,正确的解决方案是重新排序 LDAP/AD 结构以适应需要。
我可能过度简化了这一点,但您是否也不能拒绝对您想从查询中排除的 OU 的列表/读取访问权限?假设您使用特定的服务帐户来执行查找,这应该可以工作。