目录对象选取器

目录对象选取器对话框允许用户从全局目录、域或计算机或工作组中选择一个或多个对象。 用户可以从中选择的对象类型包括用户、联系人、组和计算机对象。 有关 Active Directory 域服务的详细信息,请参阅 Active Directory 域服务

若要显示对象选取器对话框,

  1. 调用 CoCreateInstanceCoCreateInstanceEx 函数来创建 IDsObjectPicker 接口的实例。
  2. 调用 IDsObjectPicker::Initialize 方法初始化对话框。
  3. 调用 IDsObjectPicker::InvokeDialog 方法以显示对话框。
  4. 调用对象选取器对话框返回的 IDataObject 实例的 IDataObject::GetData 方法,以检索 CFSTR_DSOP_DS_SELECTION_LIST 数据。 CFSTR_DSOP_DS_SELECTION_LIST 剪贴板格式提供包含 DS_SELECTION_LIST 结构的 HGLOBALDS_SELECTION_LIST 结构包含有关对象选取器对话框中所选项的数据。

如果对象需要安全标识符(SID),则应通过将 objectSID 属性添加到要检索所选对象的属性列表中,直接从对象选取器请求此标识符。 不建议将返回的对象名称传递给 LsaLookupNamesLookupAccountName 函数,因为名称查找将是冗余的,在某些情况下可能会失败。

如果保存对任何选定对象的引用,则不应保存可分辨名称,因为对象可能会移动、重命名,或者因区域设置差异而更改。 对于安全主体,应请求 objectSID 对象并安全地保存。 如果稍后需要安全主体的名称,可以使用 LookupAccountSid 函数进行检索。 对于所有其他对象,应请求并保存 objectGUID

初始化

初始化对象选取器对话框时,将指定一组范围类型和筛选器。 指定的作用域类型确定位置、域或计算机,例如,用户可以从中选择对象。 筛选器确定用户可以从给定范围类型中选择的对象类型。 有关详细信息,请参阅下面的“范围和筛选器”部分。

默认情况下,用户可以在目录对象选取器对话框中选择单个对象。 若要启用多个选择,请在对话框初始化时,在 flOptionsDSOP_INIT_INFO 结构的成员中设置 DSOP_FLAG_MULTISELECT 标志。

范围和筛选器

“查找” 下拉列表包含用户可以从中选择对象的作用域。 范围是一个域、计算机、工作组或全局目录,用于存储有关和提供对一组可用对象的访问。 作用域列表中的条目取决于在上次调用 IDsObjectPicker::Initialize 方法以初始化对象选取器对话框时指定的范围类型和目标计算机。

范围类型是范围的泛型类别,例如目标计算机所属的企业中的所有域,或目标计算机的企业全局目录,或目标计算机本身。 对于每个指定的作用域类型,该对话框使用目标计算机的上下文来确定范围列表条目。

IDsObjectPicker::Initialize 方法采用指向包含 DSOP_SCOPE_INIT_INFO 结构的数组的 DSOP_INIT_INFO 结构的指针。 DSOP_SCOPE_INIT_INFO 数组中的每个条目指定一个或多个范围类型以及适用的筛选器和其他属性。 筛选器确定用户可以从给定范围类型中选择的对象类型,例如用户、组、联系人和计算机。 当用户从列表中选择范围时,对话框会应用该范围类型的筛选器以显示用户可以从中选择的对象列表。

每个 DSOP_SCOPE_INIT_INFO 结构都包含一个 DSOP_FILTER_FLAGS 结构,该结构指定该范围类型的筛选器。 DSOP_FILTER_FLAGS 结构区分上层和下层范围:

  • 上层范围是支持 ADSI LDAP 提供程序的全局目录或域。
  • 下层范围包括工作组和所有单独的计算机。 该对话框使用 ADSI WinNT 提供程序访问下层范围。

定义用于 DSOP_FILTER_FLAGS 结构的筛选器标志集有两组:一个用于上层范围,一个用于下层范围。 DSOP_FILTER_FLAGS 结构的 上层 成员是一种 DSOP_UPLEVEL_FILTER_FLAGS 结构,用于指定上层范围的筛选器。 DSOP_FILTER_FLAGS 结构的 flDownlevel 成员是一组标志,用于指定下层范围的筛选器。