0

我正在尝试使用 OpenLDAP API 进行 LDAP 搜索。我已经成功连接并绑定到服务器。我已经用 ldap_search_ext_s() 完成了搜索,并用 ldap_parse_result() 解析了结果。但是,我似乎无法弄清楚如何获得搜索的实际结果。不幸的是,OpenLDAP C API 最近发生了变化,Internet 上的许多现有示例都没有使用当前的 API。

我已经尝试使用 ldap_first_attribute()、ldap_next_attribute() 和 ldap_get_values(),如http://www-archive.mozilla.org/directory/csdk-docs/search.htm所示(示例 6-13)。但是,似乎 ldap_get_values() 现在已弃用,而 ldap_get_values_len() 是最接近的替代品。新函数没有返回 char**,而是返回 berval**。我试图通过创建一个值为 barval**[i] 的 berval* 来调整此示例代码。这会导致编译成功,但会在 ber_scanf() 处进行核心转储。

有谁知道如何使用 OpenLDAP C API 获取 LDAP 搜索的结果?

更新:

特别是,我在问如何从搜索消息中获取请求的属性。

4

3 回答 3

0

搜索请求的结果总是包含一系列SearchResultEntryorSeachResultReference消息,该系列由一条消息终止SearchResultDone。调用getNextAttribute(以任何语言和任何 API)毫无意义,因为搜索结果是消息列表。API 应该以这样一种方式打包条目或引用的数组,其中调用者可以简单地检索条目或引用的列表。寻找一种方法来做到这一点。

于 2013-06-27T21:15:07.580 回答
0

在查看了 OpenLDAP API 源代码并了解了如何使用 berval 值之后,我最终偶然发现了如何获取它的值。

首先,您必须使用ldap_first_entry(). 然后,您需要使用 . 获取该条目中的第一个属性ldap_first_attribute()。然后,将值放入 berval** 数组中ldap_get_values_len()。然后可以使用 访问返回的属性值berval[i]->bv_val

您可以分别使用ldap_next_entry()和获取下一个条目和属性。ldap_next_attribute()

我希望这可以帮助任何有类似问题的人。

于 2013-06-29T18:50:56.043 回答
0

希望下面的功能可以帮助你,

int ldap_search_result(LDAP *ld, char *search_filter, char *search_base)
{
    LDAPMessage *result;
    BerElement *ber;
    char *attr;
    char **val;

    if(ldap_search_ext_s(ld, search_base, LDAP_SCOPE_CHILDREN, 
            search_filter, NULL, 0, NULL, NULL, NULL, -1, &result) != LDAP_SUCCESS) {
        return -1;
    }

    if(ldap_count_entries(ld,result) != 1) {    // assuming search_filter is unique, 
                                                // matches only one entry, and so
                                                // search routine returns only one entry
        return -1;
    }

    if((attr = ldap_first_attribute(ldp, result, &ber)) == NULL) {
        return -1;
    }

    do {
        if((val = ldap_get_values(ldp,result,attr)) == NULL) {
            return -1;
        }
        printf(" %s : %s \n", attr, val[0]); // assuming all attributes are single -
                                             //valued.
        ldap_memfree(attr);
        ldap_value_free(val);
    while((attr = ldap_next_attribute(ld,result,ber)) != NULL);
    return 0;
}
于 2018-06-21T05:58:44.593 回答