我想对以下问题有所帮助。 我想获得有关我的Active Directory组的一系列信息。
该数组将是一个二维数组,将有四列。
如果没有人能给我一个提示,那将是有帮助的。
我已经获得了以下代码的信息:
// Appel de la fonction GetDirectoryEntry
DirectoryEntry entry = GetDirectoryEntry();
// Création de l'objet de recherche
DirectorySearcher search = new DirectorySearcher(entry);
// Filtre de recherche pour récupérer tous les groupes de l'AD commençant par All Of *
search.Filter = "(&(objectClass=group)(proxyAddresses=*)(name=All Of *))";
SearchResultCollection results;
// Results, contient tous les groupes commençant par All Of *
results = search.FindAll();
答案 0 :(得分:0)
组是递归结构。因此,您需要使用member属性进行递归迭代。成员可以是用户或其他组。所以我们需要过滤成员集合
相反,二维数组y创建了以下结构,该结构允许存储父子关系:
class Group {
public int Id { get; set; }
public int? ParentId { get; set; }
public string Name { get; set; }
public List<Group> Members { get; set; }
public Group() {
Members = new List<Group>();
}
}
搜索过程可以是这样的:
class Searcher {
public string Filter { get; set; }
public Searcher(string filter) {
Filter = filter;
}
public List<Group> Search() {
return Search(null, null);
}
protected List<Group> Search(string baseDn, int? parentId) {
using (DirectoryEntry entryRoot = new DirectoryEntry("LDAP://" + baseDn)) {
//We only iterate across groups (except root nodes)
if (parentId.HasValue && !IsGroup(entryRoot))
return null;
using (DirectorySearcher search = new DirectorySearcher()) {
search.Filter = $"(&(objectClass=group){Filter})";
search.SearchRoot = entryRoot;
SearchResultCollection results = search.FindAll();
int i = 1;
var groups = new List<Group>(results.Count);
foreach (SearchResult result in results) {
using (DirectoryEntry entry = result.GetDirectoryEntry()) {
Group group = new Group {
Id = i,
Name = entry.Properties["cn"].Value.ToString(),
ParentId = parentId
};
var members = entry.Properties["member"];
foreach (string member in members) {
var subgroups = Search(member, i);
if (subgroups != null)
group.Members.AddRange(subgroups);
}
groups.Add(group);
i++;
}
}
return groups;
}
}
}
private bool IsGroup(DirectoryEntry entry) {
return entry.Properties["objectClass"].Cast<string>().Any(x => x == "group");
}
}
请注意,DirectorySearcher和DirectoryEntry都是IDisposable的,为了简单起见,我没有将它们丢弃
如果您真的需要一个数组,我认为很容易递归地遍历List
您可以将Searcher初始化为:
Searcher searcher = new Searcher("(proxyAddresses=*)(name=All Of *)");
var groups = searcher.Search();