特定 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 查询的主要内容,如果未能解决你的问题,请参考以下文章