我想在活动目录域中创建一个容器对象树,以便添加新用户。我可以通过域递归并获取目录中的所有内容,但我想将范围限制为仅对用户有效的容器。
LDAP查询如何抓取适合用户对象的节点的子节点?有更好的方法吗?
如果你很好奇,我正在使用c#,System.DirectoryServices和.net 3.5。
谢谢!
答案 0 :(得分:2)
如果您还没有,请查看有关如何使用.NET 3.5中System.DirectoryServices.AccountManagement
中的新功能的优秀MSDN article Managing Directory Security Principals in the .NET Framework 3.5。
为了绑定到您的容器,您需要知道它的LDAP路径,并且可以使用它来建立基于该容器的上下文:
PrincipalContext ctx =
new PrincipalContext(ContextType.Domain, "Fabrikam",
"ou=TechWriters,dc=fabrikam,dc=com");
有了这个背景,你现在可以,例如在该上下文中搜索某些类型的主体:
// create a principal object representation to describe
// what will be searched
UserPrincipal user = new UserPrincipal(ctx);
// define the properties of the search (this can use wildcards)
user.Enabled = false;
user.Name = "user*";
// create a principal searcher for running a search operation
PrincipalSearcher pS = new PrincipalSearcher();
// assign the query filter property for the principal object you created
// you can also pass the user principal in the
// PrincipalSearcher constructor
pS.QueryFilter = user;
// run the query
PrincipalSearchResult<Principal> results = pS.FindAll();
Console.WriteLine("Disabled accounts starting with a name of 'user':");
foreach (Principal result in results)
{
Console.WriteLine("name: {0}", result.Name);
}
这对你有用吗?这就是你要找的东西吗?
答案 1 :(得分:1)
如果我正确理解您的问题,您想知道的是Active Directory中的哪种对象可以包含用户对象。
我认为您可以从AD架构分区获得答案。我快速检查了运行Windows 2003 AD的架构分区。允许将用户对象分配给 OU ,容器, builtinDomain 和 domainDNS
我没有检查Windows 2008,但我认为它应该是相同的。很多人都知道 OU 和容器是什么。很少有人知道 builtinDomain 和 domainDNS 是什么。我怀疑它在你的情况下是否有用。 builtinDomain 是一个用于包含内置帐户的特殊容器。默认情况下,AD在CN=Builtin,DC=yourdomain,DC=com
创建了 builtinDomain 。 domainDNS 是您的根域路径DC=yourdomain,DC=com
。
这是一个在特定节点下查找Active Directory中所有类型对象的函数。如果您认为 builtinDomain 和 domainDNS 在您的案例中没有意义,请将其从LDAP过滤器中取出。
IEnumerable<DirectoryEntry> FindUserParentObject(DirectoryEntry root)
{
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
searcher.Filter = "(|(objectClass=organizationalUnit)(objectClass=container)(objectClass=builtinDomain)(objectClass=domainDNS))";
searcher.SearchScope = SearchScope.Subtree;
searcher.PageSize = 1000;
foreach (SearchResult result in searcher.FindAll())
{
yield return result.GetDirectoryEntry();
}
}
}