Список всех групп Active Directory

В следующем коде перечислены некоторые, но не все группы Active Directory. Почему?

Я пытаюсь перечислить все группы безопасности, группы рассылки, группы компьютеров и т. Д. Я указал неверный objectClass?

private static void ListGroups()
{
    DirectoryEntry objADAM = default(DirectoryEntry);
    DirectoryEntry objGroupEntry = default(DirectoryEntry);
    DirectorySearcher objSearchADAM = default(DirectorySearcher);
    SearchResultCollection objSearchResults = default(SearchResultCollection);
    SearchResult myResult=null;

    objADAM = new DirectoryEntry(LDAP);
    objADAM.RefreshCache();
    objSearchADAM = new DirectorySearcher(objADAM);
    objSearchADAM.Filter = "(&(objectClass=group))";
    objSearchADAM.SearchScope = SearchScope.Subtree;
    objSearchResults = objSearchADAM.FindAll();

    // Enumerate groups 
    try
    {
        fileGroups.AutoFlush = true;
        if (objSearchResults.Count != 0)
        {
            foreach (SearchResult objResult in objSearchResults)
            {
                myResult = objResult;
                objGroupEntry = objResult.GetDirectoryEntry();
                Console.WriteLine(objGroupEntry.Name);
                fileGroups.WriteLine(objGroupEntry.Name.Substring(3));
            }
        }
        else
        {
            throw new Exception("No groups found");
        }  
    } 
    catch (PrincipalException e)
    {
        fileErrorLog.AutoFlush = true;
        fileErrorLog.WriteLine(e.Message + " " + myResult.Path);
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}

person cymorg    schedule 12.12.2011    source источник


Ответы (6)


Если вы используете .NET 3.5 или новее, вы можете использовать PrincipalSearcher и принцип «запрос по примеру» для поиска:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for a GroupPrincipal 
GroupPrincipal qbeGroup = new GroupPrincipal(ctx);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
}

Если вы еще этого не сделали - обязательно прочтите статью MSDN Управление принципами безопасности каталогов в .NET Framework 3.5, в котором хорошо показано, как наилучшим образом использовать новые функции в System.DirectoryServices.AccountManagement

person marc_s    schedule 12.12.2011
comment
Я бы инкапсулировал PrincipalContext, GroupPrincipal и PrincipalSearcher в блоки using, поскольку они одноразовые. - person David Bentley; 22.09.2017

Попробуйте применить фильтр "(objectcategory = group)" Найдено решение здесь

person Sergey Vedernikov    schedule 12.12.2011
comment
Извините, Сергей, результат тот же, указаны не все группы. Кажется, что ответ от marc_s работает (при условии, что вы используете .NET 3.5 или выше). - person cymorg; 12.12.2011
comment
Ссылка не работает - person El Asiduo; 23.11.2016

Я пробовал это, и это сработало

    public ArrayList GetAllGroupNames(string ipAddress, string ouPath)
    {
        DirectorySearcher deSearch = new DirectorySearcher();
        deSearch.SearchRoot = GetRootDirectoryEntry(ipAddress, ouPath);
        deSearch.Filter = "(&(objectClass=group))";
        SearchResultCollection results = deSearch.FindAll();
        if (results.Count > 0)
        {
            ArrayList groupNames = new ArrayList();

            foreach (SearchResult group in results)
            {
                var entry = new DirectoryEntry(group.Path, UserName, Password);
                string shortName = entry.Name.Substring(3, entry.Name.Length - 3);
                groupNames.Add(shortName);
            }

            return groupNames;
        }
        else
        {
            return new ArrayList();
        }
    }

    private DirectoryEntry GetRootDirectoryEntry(string ipAddress, string domainPath, string username, string password)
    {
        var ldapPath = "LDAP://" + ipAddress + "/" + domainPath;
        return new DirectoryEntry(ldapPath, username, password, AuthenticationTypes.Secure);
    }
person Dinesh Kumar P    schedule 23.02.2015
comment
Привет, что такое GetRootDirectoryEntry? - person VAAA; 20.07.2017

Чтобы получить набор результатов, размер которого превышает 1000 элементов, необходимо установить для SizeLimit значение по умолчанию (ноль) и задать для PageSize значение, меньшее или равное 1000.

objSearchADAM.PageSize = 1000;

person Khawar    schedule 27.12.2018

вы можете получить всю информацию о группе объявлений с помощью приведенной ниже командной оболочки, и если вам нужно конкретное имя для группы AD, напишите фильтр вместо *

Get-ADGroup -Filter * -properties * | Экспорт-csv c: \ csv \ new.csv

person Ankit Yadav    schedule 09.01.2019

person    schedule
comment
Это не дало мне правильных результатов, но решение marc_s дало. - person JohnB; 12.10.2018
comment
Будьте осторожны, как указано в этом сообщении в блоге, GetDirectoryEntry() загрузит ВСЕ свойства, включая те, которые вам не нужны. - person JohannesB; 04.03.2020