Четене/филтриране на подгрупите на групата за разпространение на активна директория?

Имам Active Directory с домейн myDomain.local, под него съществува Distribution Group, който съдържа много групи.
Как мога да прочета (програмно) всички тези подгрупи, за да извлека списък с имената им?
И как да оптимизирам заявката, за да филтрира резултата, така че да извлича само всички групи, които завършват с думата Region?
Между другото, използвам C#.Net, ASP.Net и sharepoint, и аз нямам опит с AD.


person Ashraf Bashir    schedule 01.07.2010    source източник


Отговори (2)


Ако сте на .NET 3.5 (или можете да надстроите до него), можете да използвате този код, като използвате пространството от имена System.DirectoryServices.AccountManagement:

// create the "context" in which to operate - your domain here, 
// as the old-style NetBIOS domain, and the container where to operate in
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "cn=Distribution Group,dc=YourDomain,dc=local");

// define a "prototype" - an example of what you're searching for
// Here: just a simple GroupPrincipal - you want all groups
GroupPrincipal prototype = new GroupPrincipal(ctx);

// define a PrincipalSearcher to find those principals that match your prototype
PrincipalSearcher searcher = new PrincipalSearcher(prototype);

// define a list of strings to hold the group names        
List<string> groupNames = new List<string>();

// iterate over the result of the .FindAll() call
foreach(var gp in searcher.FindAll())
{
    // cast result to GroupPrincipal
    GroupPrincipal group = gp as GroupPrincipal;

    // if everything - grab the group's name and put it into the list
    if(group != null)
    {
       groupNames.Add(group.Name);
    }
}

Това задоволява ли вашите нужди?

За повече информация относно пространството от имена System.DirectoryServices.AccountManagement, прочетете Управление на принципи за сигурност на директорията в .NET Статия за Framework 3.5 в списание MSDN.

person marc_s    schedule 01.07.2010
comment
Благодаря, Марк, все още не съм пробвал кода ви, но все пак ще публикувам решението, което направих, за тези, които се интересуват от темата. Много благодаря. - person Ashraf Bashir; 02.07.2010

Ето решението, което направих; за интересуващите се:

public ArrayList getGroups()
{
    // ACTIVE DIRECTORY AUTHENTICATION DATA
    string ADDomain = "myDomain.local";
    string ADBranchsOU = "Distribution Group";
    string ADUser = "Admin";
    string ADPassword = "password";

    // CREATE ACTIVE DIRECTORY ENTRY 
    DirectoryEntry ADRoot 
        = new DirectoryEntry("LDAP://OU=" + ADBranchsOU
                             + "," + getADDomainDCs(ADDomain),
                             ADUser, 
                             ADPassword);

    // CREATE ACTIVE DIRECTORY SEARCHER
    DirectorySearcher searcher = new DirectorySearcher(ADRoot);
    searcher.Filter = "(&(objectClass=group)(cn=* Region))";
    SearchResultCollection searchResults = searcher.FindAll();

    // ADDING ACTIVE DIRECTORY GROUPS TO LIST
    ArrayList list = new ArrayList();
    foreach (SearchResult result in searchResults)
    {
        string groupName = result.GetDirectoryEntry().Name.Trim().Substring(3);
        list.Add(groupName);
    }
    return list; 
}

public string getADDomainDCs(string ADDomain)
{
    return (!String.IsNullOrEmpty(ADDomain)) 
        ? "DC=" + ADDomain.Replace(".", ",DC=") 
        : ADDomain;
}
person Ashraf Bashir    schedule 03.07.2010