Active Directory OU Дерево для jqTree
Мне нужно создать действительную структуру JSON JQTree из подразделений Active Directory. Я тестирую с помощью рекурсивного метода (InfoNode) для этого, но не могу его получить.
Полученный json переходит в строку json. Первый обрабатываемый узел - это родительский каталог DirectoryEntry с корневым доменом домена по умолчанию. Рекурсивный метод (InfoNode) получает текущий дочерний узел, фильтрует по "OU" и создает свойства JSON "label" и "path". Перед проверкой, имеет ли этот узел больше дочерних элементов, чтобы записать конец текущего элемента JSON. Наконец, если есть еще дети, снова запустите метод (InfoNode):
public static DirectoryEntry root = new DirectoryEntry("LDAP://RootDSE");
public string dom = (string)root.Properties["defaultNamingContext"].Value;
public string json = "";
public Form1()
{
InitializeComponent();
DirectoryEntry parent = new DirectoryEntry("LDAP://" + dom);
InfoNode(parent);
System.IO.File.WriteAllText(@"json.txt", json);
}
void InfoNode(DirectoryEntry node)
{
string[] arr = node.Name.Split('=');
if (arr[0] == "OU")
{
json += "'children':[{'label':'" + arr[1] + "','path':'" + node.Path + "'";
if (nodo.Children == null)
{
json += "}]";
}
else
{
json += ",";
}
}
if (node.Children != null)
{
foreach (DirectoryEntry child in node.Children)
{
InfoNode(child);
}
}
}
1 ответ
Вы должны предоставить более подробную информацию о том, что не так с вашим кодом.
Я попробую:-)
Вы можете попытаться изменить свой код, как показано ниже. Не оптимально (было бы лучше использовать запуск с использованием перед разделением, больше string.Format, тестирование потомков с помощью запуска с помощью перед рекурсивным вызовом метода), но я думаю, это должно сработать.
Возможно, вам нужно будет загрузить потомков из источника ldap по мере продвижения по дереву.
public string json = "";
public Form1()
{
InitializeComponent();
DirectoryEntry parent = new DirectoryEntry("LDAP://" + dom);
json = InfoNode(parent);
System.IO.File.WriteAllText(@"json.txt", json);
}
public string InfoNode(DirectoryEntry node)
{
string[] arr = node.Name.Split('=');
var result = string.Empty;
if (arr[0].Equals("ou",StringComparison.InvariantCultureIgnoreCase))
{
result = "'{'label':'" + arr[1] + "','path':'" + node.Path + "'";
if (node.Children.Cast<DirectoryEntry>().Any())
{
result += String.Format(", children:[{0}]",
String.Join(",\n ",
node.Children.Cast<DirectoryEntry>()
.Select(InfoNode).Where(s=>!string.IsNullOrEmpty(s))
.ToArray()));
}
result += "}";
}
return result;
}