c - 此 LDAP 错误是什么意思? "00000057: LdapErr: DSID-0C090B0B, comment: Error processing control, data 0, v3839"

标签 c active-directory ldap

这针对的是事件目录 LDAP 服务器。代码在RHEL6上运行。

代码:

static void waitforuser ( const char * netid ) {
        LDAP *          ld              = NULL;
        char            ldapuri[]       = "ldaps://windc1.iastate.edu";
        char            binddn[]        = BINDDN;
        int             msgid           = 0;
        struct berval   passwd          = { 0, NULL };
        int             protocol        = LDAP_VERSION3;
        LDAPMessage *   result          = NULL;
        LDAPMessage *   msg             = NULL;
        int             err             = 0;
        char **         refs            = NULL;
        char            base[]          = "dc=iastate,dc=edu";
        int             scope           = LDAP_SCOPE_SUBORDINATE;
        char *          filter          = NULL;
        char **         attrs           = NULL;
        int             attrsonly       = 0;
        LDAPControl **  sctrls          = NULL;
        LDAPControl **  cctrls          = NULL;
        LDAPControl **  ctrls           = NULL;
        char *          matcheddn       = NULL;
        char *          text            = NULL;
        struct timeval  tv_timelimit    = { 2, 0 };
        int             sizelimit       = 0;            /* no limit */
        int             rc              = 0;

        rc = ldap_initialize(&ld, ldapuri);
        if (rc != LDAP_SUCCESS) {
                fprintf(stderr,
                    "Could not create LDAP session handle for URI=%s (%d): %s\n",
                    ldapuri, rc, ldap_err2string(rc));
                return;
        }
        fprintf(stderr, "about to ldap_set_option(PROTOCOL_VERSION)\n");
        rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &protocol);
        if (rc != LDAP_SUCCESS) {
                fprintf(stderr, "Could not set LDAP_OPT_PROTOCOL_VERSION %d\n", protocol);
                return;
        }

        fprintf(stderr, "about to ldap_simple_bind_s\n");
        rc = ldap_simple_bind_s(ld, binddn, SHHHH);
        fprintf(stderr, "ldap_simple_bind_s => %d (%s)\n", rc, ldap_err2string(rc));

       asprintf(&filter, "sAMAccountName=%s", netid);
        attrs = calloc(2, sizeof(char *));
        attrs[0] = strdup("sAMAccountName");
        attrs[1] = NULL;
        rc = ldap_search_ext(ld, base, scope, filter, attrs, attrsonly,
                sctrls, cctrls, &tv_timelimit, sizelimit, &msgid);
        if (rc != LDAP_SUCCESS) {
                fprintf(stderr, "ldap_search_ext: %d (%s)\n", rc, ldap_err2string(rc));
                return;
        }
        while ((rc = ldap_result(ld, msgid, LDAP_MSG_ONE, &tv_timelimit, &result)) > 0) {
                fprintf(stderr, "There are %d messages\n", ldap_count_messages(ld, result));
                for (msg = ldap_first_message(ld, result);
                     msg != NULL;
                     msg = ldap_next_message(ld, msg)) {
                        fprintf(stderr, " ldap_msgtype(%p) = %d\n", msg, ldap_msgtype(msg));
                        if (ldap_msgtype(msg) == LDAP_RES_SEARCH_RESULT) {
                                fprintf(stderr, "  LDAP_RES_SEARCH_RESULT\n");
                                rc = ldap_parse_result(ld, msg, &err, &matcheddn, &text, &refs, &ctrls, 0);
                                               fprintf(stderr, "ldap_parse_result:       err: %d\n", err);
                                if (matcheddn) fprintf(stderr, "ldap_parse_result: matcheddn: '%s'\n", matcheddn);
                                               fprintf(stderr, "ldap_parse_result:      refs: %p\n", refs);
                                               fprintf(stderr, "ldap_parse_result:     ctrls: %p\n", ctrls);
                                if (rc != LDAP_SUCCESS) {
                                        fprintf(stderr, "ldap_parse_result: ERR %d (%s)\n", rc, ldap_err2string(rc));
                                } else {
                                        fprintf(stderr, "ldap_parse_result:      text: '%s'\n", text ? text : "NULL!");
                                }
                        }
                        ldap_msgfree(result);
                }
        }
}

结果:

ldap_simple_bind_s => 0 (Success)
There are 1 messages
 ldap_msgtype(0x1e738a0) = 101
  LDAP_RES_SEARCH_RESULT
ldap_parse_result:       err: 80
ldap_parse_result:      refs: (nil)
ldap_parse_result:     ctrls: (nil)
ldap_parse_result:      text: '00000057: LdapErr: DSID-0C090B0B, comment: Error processing control, data 0, v3839'

使用 ldapsearch 工具进行类似的查询效果很好:

#!/bin/sh
netid="john"
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92e7e1f7e0afeaeaeaeaeaead2fbf3e1e6f3e6f7bcf7f6e7" rel="noreferrer noopener nofollow">[email protected]</a>
passwdfile=/home/john/secret
base="dc=iastate,dc=edu"
connect="-s sub -W -D $user -y $passwdfile -b $base -LLL -l 2 -o nettimeout=2"
url=ldaps://windc1.iastate.edu
ldapsearch -H $url $connect sAMAccountName=$netid sAMAccountName

结果:

dn: CN=john,OU=Users,OU=ITS,DC=iastate,DC=edu
sAMAccountName: john

最佳答案

您的 LDAP 服务器可能不支持“下属”搜索范围(我从未见过 OpenLDAP 或 Active Directory 支持开箱即用)。

要获得与 ldapsearch 的 -s sub 相同的结果,您需要将范围设置为 LDAP_SCOPE_SUBTREE 而不是 LDAP_SCOPE_SUBORDINATE

关于c - 此 LDAP 错误是什么意思? "00000057: LdapErr: DSID-0C090B0B, comment: Error processing control, data 0, v3839",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66522283/

相关文章:

有人可以向我解释为什么这是可能的吗?

c++ - 如何在未使用 C++ 连接到 DC 时获取成员计算机的专有名称

java - Spring 5,从 LDAP (AD) 获取信息

ldap - 通过 LDAP 进行外部身份验证

active-directory - 聚合 LDAP/AD 服务器

ios - 在 iOS 中使用 LDAP 进行身份验证

c - 如何通过mib监控Tuxedo

c - 为什么我在二维数组中得到相同的地址?

active-directory - AD FS 3.0 (ADFS 3.0) 能否根据自定义(非 ldap)存储对用户进行身份验证?

c - 从文件中读取字符并将它们存储在 C 中的变量中