2

У меня Active Directory с доменом myDomain.local, под ним существует Distribution Group, который содержит много групп.
Как я могу прочитать (программно) все эти подгруппы для получения списка их имен?
И как оптимизировать запрос для фильтрации результата, чтобы он просто извлекал все группы, которые заканчиваются словом Region?
BTW, я использую C# .Net, ASP.Net и sharepoint, и я не знаком с AD.Чтение/Фильтрация подгрупп группы рассылки активного каталога?

ответ

1

Вот решение, которое я сделал; для тех, кто заинтересован:

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; 
} 
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, прочитайте статью Managing Directory Security Principals in the .NET Framework 3.5 в журнале MSDN.

+0

Спасибо Marc, я еще не пробовал ваш код, но в любом случае я опубликую решение, которое я сделал для тех, кто интересуется темой. Большое спасибо. –