说如果我有类似以下的结构:LDAP从搜索中排除子OU
如何排除A和B2?
_users
|__A
|__B
|__B1
|__B2
|__B3
|__C
|__D
ou = users,dc = domain,dc = co,dc = uk;
说如果我有类似以下的结构:LDAP从搜索中排除子OU
如何排除A和B2?
_users
|__A
|__B
|__B1
|__B2
|__B3
|__C
|__D
ou = users,dc = domain,dc = co,dc = uk;
一个LDAP搜索是由4个元素组成:
在活动目录中,它不存在从递归搜索中排除OU的“自然”方式。关于LDAP,从理论的角度来看,它存在ExtensibleMatch,它允许你想要做什么,但是它在Active-Directory中是not supported。
由于目录服务器是不符合规定(如JP注意到,AD不支持扩展的匹配滤波器 ,因此是不符合),如果有与值标识的条目为 属于A
和B2
属性,排除那些与搜索过滤器。例如,如果条目 从属于A
有objectClass
与价值in-A
,您的过滤器可以排除那些 由基本对象ou=users, dc=domain, dc=co, dc=uk
,范围whole subtree
, 过滤(!(objectClass=in-A))
,并且你想要的属性列表的搜索。类似的过滤器可以是 ,其被构造成同时从A
和B2
中排除条目。
有关搜索和搜索过滤器的更多信息,请参阅LDAP: Mastering Search Filters。
唯一的办法是设置一个特殊的属性只在想要或不想要的 OU。您可以为用户使用pager
属性,或者为计算机使用physicalLocationObject属性,因为它们很少使用,通常可能会“滥用”来管理这类问题(不要忘记确认它们是否真的没有使用! !)。然后,您可以执行搜索过滤这些属性以排除OU,例如:(&(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每个结果的专有名称。如果OU的dn匹配,我继续下一个结果。如果没有,那么我采取一些行动。
对我而言,我需要轻松地将禁用的用户从ldap搜索结果中排除,或者将其他用户沿着启用(活动)帐户显示这些用户帐户。我拒绝了禁用用户OU的列表内容访问,这使得OU可见但内容不可见。结果是,人们通过使用联系人应用绑定Mac客户端进行搜索,将不再看到'幽灵'用户。
做类似的事情?一般来说,答案应该是独立的,引用*和*链接到他们使用的任何其他答案或外部资源。 – 2015-03-11 03:04:05