枚举域中的组

可以将组放置在域中的任何容器或组织单位 (OU) 以及域的根目录中。 这意味着,组可以位于目录层次结构中的多个位置。 因此,有两个选项可用于枚举组:

  1. 枚举直接包含在容器、OU 或域根目录中的组。

    显式绑定到包含要枚举的组的容器对象,使用 IADsContainer.Filter 属性将包含“groups”的筛选器设置为类,并使用 IADsContainer::get__NewEnum 方法枚举组对象。

    此方法将枚举直接包含在容器或 OU 对象中的组。 如果容器包含可能包含其他组的其他容器,则必须绑定到这些容器,并以递归方式枚举这些容器上的组。 若要操作组对象和只读特定属性,请使用选项 2 中所述的深度搜索。

    由于枚举返回指向表示每个组对象的 ADSI COM 对象的指针,因此可以调用 QueryInterface,以获取指向组对象的 IADsIADsGroupIADsPropertyList 接口指针;也就是说,可以获取指向容器中每个枚举组对象的接口指针,而无需显式绑定到每个组对象。 若要对直接在容器内的所有组执行操作,枚举不需要绑定到每个组即可调用 IADsIADsGroup 方法。 若要从组检索特定属性,请使用 IDirectorySearch,如第二个选项中所述。

    当尝试枚举包含作为已知安全主体(例如每个人、经过身份验证的用户、BATCH 等)的成员的组时,将发生此异常。 由于无法绑定到这些类型的对象,因此在枚举 WinNT 范围中的组时不会列出这些对象,即使它可能显示为绑定也是如此,因为某些 IADs 方法(如 Class、ADsPath 和 Name)在枚举成员上调用时会返回正确的结果。

  2. 对“objectCategory=group”执行深度搜索,以查找树中的所有组。

    首先,绑定到要开始搜索的容器对象。 例如,若要查找域中的所有组,请绑定到域的根目录;若要查找林中的所有组,请绑定到全局目录,然后从 GC 根目录进行搜索。

    然后使用 IDirectorySearch,通过包含 (objectCategory=group) 的搜索筛选器和 ADS_SCOPE_SUBTREE 的搜索首选项进行查询。

    注意

    可以使用 ADS_SCOPE_ONELEVEL 的搜索首选项执行搜索,以将搜索限制为绑定到的容器对象的直接内容。

     

    IDirectorySearch 仅从组检索特定属性的值。 若要检索值,请使用 IDirectorySearch。 若要操作从搜索返回的组对象,即要使用 IADsIADsGroup 方法,请显式绑定到它们。 为此,请将 distinguishedName 指定为要从搜索返回的属性之一,并使用返回的可分辨名称绑定到搜索中返回的每个组。

    仅检索特定属性。 如果未显式指定组类的每个可能属性,则无法检索所有属性。