2012-03-09 167 views
2

说如果我有类似以下的结构:LDAP从搜索中排除子OU

如何排除A和B2?

_users 
|__A 
|__B 
    |__B1 
    |__B2 
    |__B3 
|__C 
|__D 

ou = users,dc = domain,dc = co,dc = uk;

回答

6

一个LDAP搜索是由4个元素组成:

  1. 从中你问开始搜索(在分清点头名)的节点
  2. 搜索范围(基地,ONELEVEL,子树)
  3. 您搜索的过滤条件(例如(objectClass = user))
  4. 要检索的属性。

在活动目录中,它不存在从递归搜索中排除OU的“自然”方式。关于LDAP,从理论的角度来看,它存在ExtensibleMatch,它允许你想要做什么,但是它在Active-Directory中是not supported

0

由于目录服务器是不符合规定(如JP注意到,AD不支持扩展的匹配滤波器 ,因此是不符合),如果有与值标识的条目为 属于AB2属性,排除那些与搜索过滤器。例如,如果条目 从属于AobjectClass与价值in-A,您的过滤器可以排除那些 由基本对象ou=users, dc=domain, dc=co, dc=uk,范围whole subtree, 过滤(!(objectClass=in-A)),并且你想要的属性列表的搜索。类似的过滤器可以是 ,其被构造成同时从AB2中排除条目。

有关搜索和搜索过滤器的更多信息,请参阅LDAP: Mastering Search Filters

0

唯一的办法是设置一个特殊的属性只在想要不想要的 OU。您可以为用户使用pager属性,或者为计算机使用physicalLocationObject属性,因为它们很少使用,通常可能会“滥用”来管理这类问题(不要忘记确认它们是否真的没有使用! !)。然后,您可以执行搜索过滤这些属性以排除OU,例如:(&(objectclass=user)(!(pager=*)))

当然,这是低效的,正确的解决方案是重新排序LDAP/AD结构以适应需要。

0

我可能过分简化了这个,但是你不能也拒绝你希望从查询中排除的OU的列表/读取访问吗?假设你正在使用特定的服务帐户来执行查找,这应该工作。

1

我正在做类似的事情。我首先使用搜索范围设置为'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匹配,我继续下一个结果。如果没有,那么我采取一些行动。

+0

做类似的事情?一般来说,答案应该是独立的,引用*和*链接到他们使用的任何其他答案或外部资源。 – 2015-03-11 03:04:05

1

对我而言,我需要轻松地将禁用的用户从ldap搜索结果中排除,或者将其他用户沿着启用(活动)帐户显示这些用户帐户。我拒绝了禁用用户OU的列表内容访问,这使得OU可见但内容不可见。结果是,人们通过使用联系人应用绑定Mac客户端进行搜索,将不再看到'幽灵'用户。