获取新用户的活动目录容器对象

时间:2011-01-24 03:37:02

标签: c# active-directory ldap directoryservices

我想在活动目录域中创建一个容器对象树,以便添加新用户。我可以通过域递归并获取目录中的所有内容,但我想将范围限制为仅对用户有效的容器。

LDAP查询如何抓取适合用户对象的节点的子节点?有更好的方法吗?

如果你很好奇,我正在使用c#,System.DirectoryServices和.net 3.5。

谢谢!

2 个答案:

答案 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();
        }
    }
}