如何在Asp.net树视图中列出活动目录项

本文关键字:活动 视图 Asp net | 更新日期: 2023-09-27 18:01:46

我将活动目录条目绑定到我的asp.net treeview控件中,但无法完全实现。我想将AD条目绑定到我的树视图中,因为它看起来与Active Directory树层次结构中相同。

我可以绑定Main Ou,但我不能绑定它的child of child,而且一些Ou的孩子可能有孩子,有些孩子可能没有孩子。

我不确定最后一个结尾,所以我不确定for循环计数,它可能像下面这样,

A
|__A1
   |__A11
      |_A111
        |_...
B
|__B1
|__B2
C
 |__C1
    |__C11

那么在这种情况下,我如何构建我的树视图来获得活动目录的这些结构?我不知道如何处理这个for循环。请帮我在我的treeview1上实现这个结构。

下面是我的代码:

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

如何在Asp.net树视图中列出活动目录项

首先,您应该搜索所有条目(而不仅仅是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"。其他可能对您有用的节点类型是"group", "computer", "user", "contact"

旧话题…

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

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));