特定 OU 中子 OU 中所有用户的 LDAP 查询

Posted

技术标签:

【中文标题】特定 OU 中子 OU 中所有用户的 LDAP 查询【英文标题】:LDAP query for all users in sub OUs within a particular OU 【发布时间】:2009-06-26 16:27:16 【问题描述】:

我必须处理的活动目录是这样布置的:域包含许多 OU。这些 OU 之一被命名为“主 OU”。在这个 OU 中,有几个以全球办事处位置命名的 OU(即“芝加哥”“巴黎”)。

任何实际有血有肉的用户帐户都会放入以他们工作的办公室命名的 OU 中,作为他们的主要 OU。任何作为别名、通用帐户或不直接与真实人员关联的用户帐户,都将“主要 OU”OU 设置为其主要 OU。

在数据方面,这个主要的 OU 区别是唯一表明哪些用户是真人,哪些用户不是真人的东西。没有只包含真人的组,在任何字段中都没有指示他们是否是真人,并且严格禁止对 Active Directory 或任何用户帐户进行任何更改。

我的任务是编写一个查询,它只会获取所有真正有血有肉的人。

不幸的是,LDAP 并不是我的强项,我想出的唯一方法是单独搜索每个办公室子 OU 并将所有结果放在一起,但是有很多办公室,需要进行更改查询是否添加了任何办公室,我需要避免。

有没有办法查询特定 OU 的“子”OU 中的所有用户,但不直接返回父 OU 中的任何用户?

【问题讨论】:

什么编程环境? 。网 ?? .NET 2.0 还是 .NET 3.5 ?? 我正在寻找 LDAP 查询,但我最终将使用 .NET 3.5 中的 DirectorySearcher 对象来执行查询 【参考方案1】:

是的,当然 - 您需要:

1) 绑定到特定的 OU

DirectoryEntry myOU = new DirectoryEntry("LDAP://OU=MyOU,......,DC=MyCompany,DC=com");

2) 枚举其所有子OU的

DirectorySearcher subOUsearcher = new DirectorySearcher(myOU);
subOUsearcher.SearchScope = SearchScope.OneLevel; // don't recurse down
subOUsearcher.Filter = "(objectClass=organizationalUnit)";

foreach(SearchResult subOU in subOUsearcher.FindAll())

   // stick those Sub OU's into a list and then handle them

3) 逐一枚举每个子OU中的所有用户,并将其粘贴到全局用户列表中

DirectorySearcher userSearcher = new DirectorySearcher(myCurrentSubOu);
userSearcher.SearchScope = SearchScope.OneLevel; // don't recurse down
userSearcher.Filter = "(objectClass=user)";

foreach(SearchResult user in userSearcher.FindAll())

  // stick those users into a list being built up

4) 返回该列表

马克

【讨论】:

这可能是我必须走的路,我只是好奇是否有某种方法可以编写查询以一次性返回所有用户,比如可能只有一个 searchScope 设置搜索子 OU 而不是父 OU。 不,我不认为你可以在一个请求中做到这一点 - 你必须一点一点地获取你的信息:-) 以防万一其他人像我一样遇到这种情况:您应该确保在上面的步骤 3) 中“myCurrentSubOu”是 DirectoryEntry 类型 - 我使用了 subOU 的 Path 属性类型细绳。由于接受字符串(过滤器)的 DirectorySearcher 构造函数也有重载,这可能会导致看似奇怪的行为。【参考方案2】:
// Create a new DirectorySearcher that starts at the root.
// You can start it anywhere you want though
//     by providing a value in the DirectoryEntry constructor.
DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry());

// Set the scope to Subtree in order to search all children.
searcher.SearchScope = SearchScope.Subtree;

// Set the filter to only look for Organizational Units
//     that have the name you are looking for.
searcher.Filter = "(&(objectClass=organizationalUnit)(name=" + ouName + "))";

// If you are looking for only one result then do the following two things.
SearchResult result = searcher.FindOne();

DirectoryEntry newDir = result.GetDirectoryEntry();

【讨论】:

以上是关于特定 OU 中子 OU 中所有用户的 LDAP 查询的主要内容,如果未能解决你的问题,请参考以下文章

用于搜索多个特定 OU 的 LDAP 根查询语法

更改 LDAP OU 后如何更新 gitlab 用户

LDAP2-创建OU创建用户

LDAP 查询以返回包含给定用户的 OU

从多个 OU 中递归查询用户的 LDAP 角色

java ldap根据用户名查询