枚举用户

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

  • 枚举直接包含在容器、OU 或域根目录中的用户:

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

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

    由于枚举将返回指向表示每个用户对象的 ADSI COM 对象的指针,因此可以调用 QueryInterface,以获取指向用户对象的 IADsIADsUserIADsPropertyList 接口指针。 这意味着,可以获取容器中每个枚举用户对象的接口指针,而无需显式绑定到每个用户对象。 若要对直接在容器中的所有用户执行操作,枚举可避免必须绑定到每个用户才能调用 IADsIADsUser 方法。 若要从用户检索特定属性,请使用 IDirectorySearch,如选项 2 中所述。

  • 对 (&(objectClass=user)(objectCategory=person)) 执行深度搜索,以查找树中的所有用户:

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

    然后使用 IDirectorySearch,通过包含 (&(objectClass=user)(objectCategory=person)) 的搜索筛选器以及 ADS_SCOPE_SUBTREE 的搜索首选项进行查询。

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

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

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