Перечисление групп в домене
Группы можно поместить в любой контейнер или подразделение в домене, а также корневой каталог домена. Это означает, что группы могут находиться в нескольких расположениях в иерархии каталогов. Поэтому у вас есть два варианта перечисления групп:
Перечисление групп, непосредственно содержащихся в контейнере, подразделении или в корне домена.
Явным образом привязывается к объекту контейнера, который содержит группы для перечисления, задайте фильтр, содержащий "группы" в качестве класса с помощью свойства IADsContainer.Filter и используйте метод IADsContainer::get__NewEnum для перечисления объектов группы.
Этот метод перечисляет группы, содержащиеся непосредственно в контейнере или объекте подразделения. Если контейнер содержит другие контейнеры, которые могут содержать другие группы, необходимо привязать к этим контейнерам и рекурсивно перечислить группы в этих контейнерах. Чтобы управлять объектами группы и читать только определенные свойства, используйте глубокий поиск, описанный в варианте 2.
Так как перечисление возвращает указатели на объекты ADSI COM, представляющие каждый объект группы, можно вызвать QueryInterface для получения IADs, IADsGroup и указателей интерфейса IADsPropertyList на объект группы. То есть можно получить указатели интерфейса к каждому перечислению объекта группы в контейнере без явной привязки к каждому объекту группы. Для выполнения операций со всеми группами непосредственно в контейнере перечисление не требует привязки к каждой группе для вызова методов IAD или IADsGroup . Чтобы получить определенные свойства из групп, используйте IDirectorySearch , как описано во втором варианте.
Исключение из этого возникает при попытке перечислить группу, содержащую элементы, которые являются хорошо известными субъектами безопасности, такими как "Все", "Прошедшие проверку подлинности", "ПАКЕТ" и т. д. Так как вы не можете привязать эти типы объектов, они не перечислены при перечислении групп в область WinNT, даже если они могут быть привязаны, так как некоторые методы IADs, такие как Class, ADsPath и Name, возвращают правильные результаты при вызове перечисляемых элементов.
Выполните глубокий поиск объекта ObjectCategory=group, чтобы найти все группы в дереве.
Во-первых, привязывайся к объекту контейнера, где начинается поиск. Например, чтобы найти все группы в домене, привязать к корневому каталогу домена; чтобы найти все группы в лесу, привязаться к глобальному каталогу и выполнить поиск из корневого каталога GC.
Затем используйте IDirectorySearch для запроса с помощью фильтра поиска, содержащего (objectCategory=group) и предпочтения поиска ADS_SCOPE_SUBTREE.
Примечание.
Вы можете выполнить поиск с предпочтениями поиска ADS_SCOPE_ONELEVEL , чтобы ограничить поиск прямым содержимым объекта контейнера, к которому вы привязаны.
IDirectorySearch извлекает только значения определенных свойств из групп. Чтобы получить значения, используйте IDirectorySearch. Чтобы управлять объектами группы, возвращаемыми из поиска, то есть использовать методы IAD или IADsGroup, явно привязываются к ним. Для этого укажите различающееся имя как одно из свойств, возвращаемых из поиска, и используйте возвращаемые различающиеся имена для привязки к каждой группе, возвращаемой в поиске.
Извлекаются только определенные свойства. Невозможно получить все атрибуты без явного указания каждого возможного атрибута класса группы.