使用Active Directory组信息填充数组

时间:2018-07-27 07:57:17

标签: c# arrays active-directory

我想对以下问题有所帮助。 我想获得有关我的Active Directory组的一系列信息。

该数组将是一个二维数组,将有四列。

  1. ID-> 1,2,3,...最大ID取决于组数
  2. 组名
  3. 父级ID->如果是父级组,则添加数字
  4. ID子--如果是先前父组​​的子,则添加ID父的数量

如果没有人能给我一个提示,那将是有帮助的。

我已经获得了以下代码的信息:

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

1 个答案:

答案 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();