Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Asp.net树状视图中列出Active directory条目_C#_Asp.net_Active Directory_Treeview - Fatal编程技术网

C# 如何在Asp.net树状视图中列出Active directory条目

C# 如何在Asp.net树状视图中列出Active directory条目,c#,asp.net,active-directory,treeview,C#,Asp.net,Active Directory,Treeview,我正在将active directory条目绑定到asp.net treeview控件中,但无法完全实现。我想将广告条目绑定到我的treeview中,因为它看起来与Active Directory树层次结构中的一样 我可以绑定主要Ou,但我无法绑定它的child之子,而且Ou的一些孩子可能有孩子,其中一些孩子可能没有孩子 我不确定最后一个端点,所以我不确定for循环计数,它可能如下所示 A |__A1 |__A11 |_A111 |_... B |__

我正在将active directory条目绑定到asp.net treeview控件中,但无法完全实现。我想将广告条目绑定到我的treeview中,因为它看起来与Active Directory树层次结构中的一样

我可以绑定主要Ou,但我无法绑定它的child之子,而且Ou的一些孩子可能有孩子,其中一些孩子可能没有孩子

我不确定最后一个端点,所以我不确定for循环计数,它可能如下所示

A

|__A1

   |__A11

      |_A111

        |_...
B

|__B1

|__B2

C

 |__C1

    |__C11
那么在这种情况下,我如何构建我的树视图来获得这些active directory的结构呢?我不知道如何进行for循环。请帮助我在我的TreeView 1上实现此结构

这是我的密码:

DirectoryEntry ADentry = new DirectoryEntry("LDAP://10.36.6.163/DC=server,DC=local", AD.LDAPUser, AD.Password, AuthenticationTypes.Secure);

    DirectorySearcher Searcher = new DirectorySearcher(ADentry);
    Searcher.Filter = ("(objectClass=organizationalUnit)");
    foreach (DirectoryEntry firstChild in ADentry.Children)
    {
        if (firstChild.Name.Contains("OU"))
        {
            TreeNode Node = new TreeNode(firstChild.Name.Remove(0,3));
            TreeView1.Nodes.Add(Node);

            foreach (DirectoryEntry secondchild in firstChild.Children)
            {

                TreeNode childNode=new TreeNode(secondchild.Name.Remove(0,3));
                Node.ChildNodes.Add(childNode);

                if (secondchild.Children != null)
                {
                    ??????
                }
            }
        }
    }
通过使用这段代码,我只能像下面提到的那样绑定根节点的主OU,而不能获取其子节点的子节点。需要将相应子节点与相应父节点绑定

A
B
C

首先,您应该搜索所有条目(而不是仅搜索OU),并使用
Searcher.FindOne().GetDirectoryEntry().Children
来获取结果,而不是
ADentry.Children

指定所有条目(
(objectClass=*)
)时,第一个返回的结果始终是根域

其次,您应该过滤结果的
SchemaClassName
,以删除您不感兴趣的条目

那么比如说,

DirectoryEntry ADentry = new DirectoryEntry("LDAP://10.36.6.163/DC=server,DC=local", AD.LDAPUser, AD.Password, AuthenticationTypes.Secure);

DirectorySearcher Searcher = new DirectorySearcher(ADentry);
Searcher.Filter = ("(objectClass=*)");  // Search all.

// The first item in the results is always the domain. Therefore, we just get that and retrieve its children.
foreach (DirectoryEntry entry in Searcher.FindOne().GetDirectoryEntry().Children)
{
    if (ShouldAddNode(entry.SchemaClassName))
        TreeView1.Nodes.Add(GetChildNode(entry));
}
GetChildNode()
方法定义如下:

private TreeNode GetChildNode(DirectoryEntry entry)
{
    TreeNode node = new TreeNode(entry.Name.Substring(entry.Name.IndexOf('=') + 1));

    foreach (DirectoryEntry childEntry in entry.Children)
    {
        if (ShouldAddNode(childEntry.SchemaClassName))
            node.Nodes.Add(GetChildNode(childEntry));
    }

    return node;
}
注意:ShouldAddNode()方法仅用于筛选有用的节点类型,例如
“organizationalUnit”
。其他可能对您有用的节点类型有
“组”
“计算机”
“用户”
“联系人”
,旧主题

如果你搜索一切只是为了找到根,那么为什么还要搜索呢?你在第一行有根。。。下面的代码将给出完全相同的结果

DirectoryEntry ADentry = new DirectoryEntry("LDAP://10.36.6.163/DC=server,DC=local", AD.LDAPUser, AD.Password, AuthenticationTypes.Secure);
foreach (DirectoryEntry entry in ADentry.Children)
{
    if (ShouldAddNode(entry.SchemaClassName))
        TreeView1.Nodes.Add(GetChildNode(entry));
}
如果你想在树视图中找到根,那就更容易了

DirectoryEntry ADentry = new DirectoryEntry("LDAP://10.36.6.163/DC=server,DC=local", AD.LDAPUser, AD.Password, AuthenticationTypes.Secure);
TreeView1.Nodes.Add(GetChildNode(ADentry));

Search.FindAll()的可能重复项返回同一级别的所有OU,甚至它是一个子OU。这就是为什么我没有使用这个。在GetChildNode func中,我们需要将node.Nodes.Add()替换为node.ChildNodes.Add()。通过使用GetChildNode功能,我可以实现适当的场景。非常感谢你的帖子。我已经更新了上面的答案。现在,它将获得该域并列出其子域。这样,您就不会遇到获得sub-OU的问题。