C# 获取新用户的active directory容器对象

C# 获取新用户的active directory容器对象,c#,active-directory,ldap,directoryservices,C#,Active Directory,Ldap,Directoryservices,我想在active directory域中创建一个容器对象树,新用户可以添加到其中。我可以在域中递归并获取目录中的所有内容,但我想将范围限制为仅对用户有效的容器 LDAP查询获取适合用户对象的节点的子节点时会是什么样子?有更好的方法吗 如果您好奇的话,我正在使用c#、System.DirectoryServices和.NET3.5 谢谢 如果您尚未使用.NET 3.5中的System.DirectoryServices.AccountManagement中的新功能,请查看有关如何使用这些新功能的

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

LDAP查询获取适合用户对象的节点的子节点时会是什么样子?有更好的方法吗

如果您好奇的话,我正在使用c#、System.DirectoryServices和.NET3.5

谢谢

如果您尚未使用.NET 3.5中的
System.DirectoryServices.AccountManagement
中的新功能,请查看有关如何使用这些新功能的精彩文章

为了绑定到您的容器,您需要知道它的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);
}
//创建一个主要对象表示来描述
//将搜索什么
UserPrincipal用户=新的UserPrincipal(ctx);
//定义搜索的属性(可以使用通配符)
user.Enabled=false;
user.Name=“user*”;
//创建用于运行搜索操作的主体搜索器
PrincipalSearcher pS=新PrincipalSearcher();
//为创建的主体对象指定查询筛选器属性
//您还可以在中传递用户主体
//主搜索构造函数
pS.QueryFilter=用户;
//运行查询
PrincipalSearchResult结果=pS.FindAll();
Console.WriteLine(“以“用户”名称开头的已禁用帐户:”;
foreach(结果中的主要结果)
{
WriteLine(“名称:{0}”,result.name);
}

这对你有用吗?这就是您要找的吗?

如果我正确理解了您的问题,您想知道的是Active Directory中哪些类型的对象可以包含用户对象

我认为您可以从AD模式分区中得到答案。我快速检查了运行Windows 2003 AD的模式分区。允许将用户对象分配给OU、容器、内置域和域DNS

我没有检查Windows 2008,但我相信它应该是一样的。很多人都知道OU和container是什么。很少有人知道什么是内置域名和域名。我怀疑它对你的情况是否有用。builtinDomain是一个用于包含内置帐户的特殊容器。默认情况下,AD在
CN=Builtin,DC=yourdomain,DC=com
处创建了一个内置域。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();
        }
    }
}
IEnumerable FindUserParentObject(目录项根目录)
{
使用(DirectorySearcher search=新的DirectorySearcher(根))
{
searcher.Filter=“(|)(objectClass=organizationalUnit)(objectClass=container)(objectClass=buildinDomain)(objectClass=domainDNS))”;
searcher.SearchScope=SearchScope.Subtree;
searcher.PageSize=1000;
foreach(searcher.FindAll()中的SearchResult)
{
产生返回结果。GetDirectoryEntry();
}
}
}