C # PrincipalSearcher, возвращающий группы AD для определенного OU - PullRequest
4 голосов
/ 02 апреля 2012

У меня проблемы с этим кодом, особенно с PrincipalSearcher.Я пытаюсь получить список всех групп, связанных с определенным подразделением.

Я пытаюсь просто вернуть группы «Безопасность» во всех областях действия групп, кроме групп рассылки.

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

HelpServicesGroup TelnetClients Администраторы Пользователи Гости Операторы печати Операторы резервного копирования Replicator Пользователи удаленного рабочего стола Конфигурация сети Операторы Монитор производительности Производительность Журнал пользователей Распределенные пользователи COM Пользователи домена Компьютеры Контроллеры доменов Администраторы предприятия Администраторы Cert PublishersАдминистраторы домена. Пользователи домена. Гости домена. Создатели групповой политики. Владельцы серверов RAS и IAS. Операторы серверов. Операторы учетных записей Совместимость с пре-Windows 2000. Входящие доверительные леса. Группа авторизации доступа Windows. Терминальные серверы. Лицензионные серверы. DnsAdmins DnsUpdateProxy.если, возможно, область действия неверна или, возможно, я пропускаю какую-то фильтрацию.

Соответствующий сегмент кода:

    public static ArrayList GetAllGroups()
    {
        var myItems = new ArrayList();

        var ctx = new PrincipalContext(ContextType.Domain,"MyOU");

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

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

        // find all matches
        foreach (Principal found in srch.FindAll())
        {
            var foundGroup = found as GroupPrincipal;

            if (foundGroup != null)
            {
                myItems.Add(foundGroup.Name);
            }
        }
        return myItems;
    }

Как сделать так, чтобы исключить встроенные группы?

Любая помощь с этим будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 02 апреля 2012

Две вещи:

  1. нет групп , связанных с OU - OU - это контейнер , который содержит пользователей, компьютеров, групп и т. Д. (Например, каталог, содержащий файлы). Это то, что вы имели ввиду? Вы хотите перечислить группу , содержащуюся внутри данного подразделения ??

  2. если это так: вы неправильно вызываете конструктор для PrincipalContext. Если вы посмотрите документацию MSDN для PrincipalContext конструкторов , вы увидите, что вы используете тот, который имеет ContextType и name, что означает домен имя контекста, с которым вы хотите связать:

    var ctx = new PrincipalContext(ContextType.Domain,"MyOU");
    

    Это связывается с доменом MyOU - и оно связывается прямо в корне этого доменного дерева.

Вероятно, вам нужен конструктор с тремя параметрами - ContextType и , две строки - первая - это имя домена, как указано выше, а вторая - начальное расположение Результат поиска. Поэтому измените вашу PrincipalContext конструкцию на:

var ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=MyOU");

и затем повторите поиск - сейчас вы должны получить только группы, которые содержат внутри контейнера OU=MyOU.

4 голосов
/ 02 апреля 2012

Вы можете попробовать:

    var myItems = new ArrayList();

    var ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName, "OU=Groups,DC=Domain,DC=Com");

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

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

    // find all matches 
    foreach (Principal found in srch.FindAll())
    {
        var foundGroup = found as GroupPrincipal;

        if (foundGroup != null && foundGroup.IsSecurityGroup == true)
        {
            myItems.Add(foundGroup.Name);
        }
    } 

PrincipalContext требует contextType, Domain и DN контейнера (если вы просто хотите найти контейнер).

foundGroup! = Null && foundGroup.IsSecurityGroup == true вернет все группы безопасности. Что ты хочешь?

Вы также можете использовать GroupScope для уточнения вещей, если хотите:

foundGroup! = Null && foundGroup.GroupScope == GroupScope.Global сузит область действия до глобальных групп.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...