使用 IDirectorySearch 对搜索结果排序

默认情况下,搜索结果的返回顺序没有保证。 ADS_SEARCHPREF_SORT_ON 首选项指示服务器在将结果集返回给客户端之前,根据指定的属性值对结果集进行排序。

建议使用索引属性进行排序。 否则,服务器必须检索完整的结果集并对其进行排序,然后才能将任何结果发送到客户端。 这也适用于分页搜索。 请注意,如果筛选器包含索引属性,并且该属性指定为排序键,则排序搜索的性能将提高;在这种情况下,Active Directory 可以在处理筛选器时满足排序要求。 例如,针对一组用户的高效排序查询可以具有包含 (sn>smith) 的筛选器和 sn 的排序键。

使用 ADS_SEARCHPREF_SORT_ON 搜索选项进行服务器端排序会降低服务器的性能。 如果要执行多次搜索,请考虑在客户端手动对结果进行排序,以减少服务器上的工作负载。

默认情况下,结果排序处于禁用状态。 若要启用结果排序,请设置使用 ADSTYPE_PROV_SPECIFIC ADS_SEARCHPREF_SORT_ON 搜索选项,该选项指向传递给 IDirectorySearch::SetSearchPreference 方法的 ADS_SEARCHPREF_INFO 数组中的 ADS_SORTKEY 结构。 ADS_SORTKEY 结构用于指定要排序的属性和排序顺序。

以下代码示例显示如何启用结果排序。

ADS_SORTKEY SortKey;
SortKey.pszAttrType = L"cn";
SortKey.pszReserved = NULL;
SortKey.fReverseorder = FALSE;

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_SORT_ON;
SearchPref.vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPref.vValue.ProviderSpecific.dwLength = sizeof(SortKey);
SearchPref.vValue.ProviderSpecific.lpValue = (LPBYTE)&SortKey;

Active Directory 不支持对构造的属性进行排序,因此无法指定用于排序的构造属性。 distinguishedName 属性也不能用于排序。 Active Directory 也不允许对多个属性进行排序,因此 ADS_SEARCHPREF_SORT_ON 搜索选项只能包含一个 ADS_SORTKEY 结构。