我将活动目录条目绑定到我的asp.net treeview控件但无法完全实现。我想将AD条目绑定到我的树视图中,因为它看起来与Active Directory树层次结构中的相同。
我能够绑定主要的OU但我无法绑定其孩子的孩子,而且一些欧儿的孩子可能有孩子,其中一些孩子或没有孩子。
我不确定最后一个结果所以我不确定for循环计数,它可能如下所示,
A
|__A1
|__A11
|_A111
|_...
B
|__B1
|__B2
C
|__C1
|__C11
所以在这种情况下,我如何构建我的treeview来获取这些活动目录的结构?我不知道如何继续使用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
答案 0 :(得分:2)
首先,您应该搜索所有条目(而不仅仅是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"
。
答案 1 :(得分:0)
老话题......
如果您只是为了找到根来搜索所有内容,那么为什么要搜索?你在第一行有根...下面的代码会给你完全相同的结果。
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));
}
如果你想在树视图中使用root,那就更容易了。
DirectoryEntry ADentry = new DirectoryEntry("LDAP://10.36.6.163/DC=server,DC=local", AD.LDAPUser, AD.Password, AuthenticationTypes.Secure);
TreeView1.Nodes.Add(GetChildNode(ADentry));