0

Как получить список всех членов и (членов) подгрупп в пределах определенной группы/отдела с использованием DirectorySearcher и Filter/PropertiesToLoad?Найти член и член подгруппы

На данный момент я могу заставить группу вернуть всех своих членов. Однако в группе есть подгруппы, и я не могу добраться до членов в этих подгруппах.

Это то, что я до сих пор:

 DirectoryEntry entry = null; 
    entry = new DirectoryEntry("LDAP://DC=au,DC=company,DC=com", null, null, AuthenticationTypes.Secure); 

    try 
    { 
     DirectorySearcher ouSearch = new DirectorySearcher(entry); 
     ouSearch.Filter = "(&(objectClass=user)(objectCategory=person)(displayName=*" + username + "*)" + 
     "(|" + 
      "(memberOf=CN=my department,OU=ADC-Distribution Groups,DC=au,DC=company,DC=com)" + 

     ")" + 

     ")"; 

     ouSearch.PropertiesToLoad.Add("samAccountName"); 
     ouSearch.PropertiesToLoad.Add("displayName"); 
     ouSearch.PropertiesToLoad.Add("memberOf"); 
     ouSearch.SearchScope = SearchScope.Subtree; 

     SearchResultCollection allOUS = ouSearch.FindAll(); 

Любая помощь оценили!

ответ

1

Вам придется выполнять поиск, рекурсивно расширяя каждую подгруппу, являющуюся членом другой группы.

Однако существует гораздо более простой способ использования класса GroupPrincipal пространства имен System.DirectoryServices.AccountManagement.

GroupPrincipal имеет метод GetMembers, который позволяет извлекать все члены группы рекурсивно. Все, что вам нужно сделать, это указать true как единственный параметр для GetMembers.

В следующем примере копируется из MSDN:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain,                  
             "fabrikam.com", 
             "DC=fabrikam,DC=com", 
             "administrator", 
             "SecretPwd123"); 

GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, 
               IdentityType.Name, 
               "Domain Admins"); 

if (grp != null) 
{ 
    foreach (Principal p in grp.GetMembers(recursive: true)) 
    { 
     Console.WriteLine(p.Name); 
    } 
    grp.Dispose(); 
} 

ctx.Dispose(); 
+0

Спасибо так много Jakob .... Я искал решение в течение нескольких дней, и это именно то, что я после. Большое спасибо за ваш ответ! –

+0

Знаете ли вы, есть ли какая-то фильтрация имени, которую я могу использовать для класса GroupPrincipal? Мой getMembers() возвращает более 1 тыс. Членов, и это занимает много времени - мне нужно прокрутить каждый элемент и проверить, совпадает ли их имена с определенным шаблоном. Атм, это займет 10 секунд, чтобы пройти через каждый! –

+0

@viv_acious: Я не думаю, что вы можете фильтровать этот путь. Но почему бы не выполнить поиск пользователей, использующих PrincipalSearcher, вместо использования GetMembers? –