LDAP Search 实例代码

#include  <iostream>
using namespace std;

#include  <ldap.h>

int printResult(LDAP *ld, LDAPMessage *result)
{
    int nRet = 0;
   
    int nCount = ldap_count_messages( ld, result );
    if (nCount <= 0)
    {
        cout << " no record !!!" << endl;
        return nRet;
    }
   
    cout << "The count of search is :" << nCount << endl;
   
    LDAPMessage     *e;
    char            *a, *dn;
    //void            *ptr;
    struct berval    **vals;
   
    int             i = 0;
    /* step through each entry returned */
   for ( e = ldap_first_entry( ld, result);
         e != NULL;
         e = ldap_next_entry( ld, e ) )
   {
       /* print its name */
       dn = ldap_get_dn( ld, e );
       cout << "dn: " << dn << endl;
       free( dn );

       /* print each attribute */
       BerElement *berptr;
       for ( a = ldap_first_attribute( ld, e, &berptr );
             a != NULL;
             a = ldap_next_attribute( ld, e, berptr ) )
       {
           cout << "attribute: " << a << endl;
           /* print each value */
           vals = ldap_get_values_len( ld, e, a);
           for ( i = 0; vals[i] != NULL; i++ )
           {
               cout << "Length: " << vals[i]->bv_len << " value: " << vals[i]->bv_val << endl;
           }
           ldap_value_free_len(vals);
       }
        cout << " ==========================one line finished " << endl;
   }

    return 0;
}

// Search for async mode

int searchLDAP_as(LDAP *ld )
{  
    cout << "********************************** Enter searchLDAP_as *********************" << endl;
    LDAPControl *serverctrls = NULL;
    LDAPControl *clientctrls = NULL;
    struct timeval tv = {10,0}; //  LDAP_SCOPE_CHILDREN

    int nMsgidp = 0;
    int nRet = ldap_search_ext(ld, "dc=mydomain,dc=com", LDAP_SCOPE_SUBTREE,
                               NULL, NULL, 0, NULL/*&ctrls*/, NULL,
                               NULL, 0, &nMsgidp);
    if (LDAP_SUCCESS != nRet)
    {
        cout << "Fail in ldap_search_ext !!!" << endl;
        return nRet;
    }
   
    //ldap_control_free( psctrl );
  
    int finished = 0;
    char      *a, *dn;
    LDAPMessage      *result, *e;
    int   num_entries = 0;
    while ( !finished )
    {  
       /* Poll for results.   We call ldap_result with the "all" argument   * set to LDAP_MSG_ONE. 
            This causes ldap_result() to return exactly one     * entry if at least one entry is available. 
            This allows us to  * display the entries as they are received.     */
        result = NULL;
        int rc = ldap_result( ld, nMsgidp, LDAP_MSG_ONE, NULL /* no timeout */, &result );   
        switch ( rc )
        {
            case -1:        /* some error occurred */      
                cout << "error message is :"<< ldap_err2string( rc) << endl;      
                //ldap_unbind( ld );     
                return( 1 );   
            case 0:     /* Timeout was exceeded.  No entries are ready for retrieval. */       
                if ( result != NULL )
                {    
                    ldap_msgfree( result );    
                }      
                break; 
            default:
                /** Either an entry is ready for retrieval, or all entries have  been retrieved.   */    
                if (( e = ldap_first_entry( ld, result )) == NULL )
                {       /* All done */     
                    finished = 1;      
                    if ( result != NULL )
                    {
                        ldap_msgfree( result );    
                    }      
                    continue;      
                }
                printResult(ld, result);
                ldap_msgfree( result );
        }   
    }

    cout << "********************************** Leave searchLDAP_as *********************/n" << endl;
    return nRet;
}

// Search for sync mode

int searchLDAP_s(LDAP *ld )
{  
    cout << "********************************** Enter searchLDAP_s *********************" << endl;
    LDAPControl *serverctrls = NULL;   
    LDAPControl *clientctrls = NULL;

    LDAPMessage *res = NULL ;
    int nRet =  ldap_search_ext_s(ld,
                                  "dc=mydomain,dc=com",
                                  LDAP_SCOPE_SUBTREE, // LDAP_SCOPE_CHILDREN
                                  NULL,
                                  NULL,
                                  0,
                                  NULL,  // &serverctrls
                                  NULL, /* no client ctrls */
                                  NULL, /* no time out */
                                  0, /* no site limit */
                                  &res);
    if (nRet != LDAP_SUCCESS)
    {
        cout << "Fail in ldap_search_ext_s !!!" << endl;
        return -1;
    }

    printResult(ld,res);
    ldap_msgfree( res );
    cout << "********************************** Leave searchLDAP_s *********************/n" << endl;
    return nRet;
}

 

int main()
{

    LDAP * ldapInfo = NULL;
    int nRet = ldap_initialize(&ldapInfo, "ldap://127.0.0.1");
    if (nRet != LDAP_SUCCESS)
    {
        cout << "Fail in init ldap !!!" << endl;
        return -1;
    }

    int nOldLdapVersion = 0;
    nRet =  ldap_get_option(ldapInfo, LDAP_OPT_PROTOCOL_VERSION, (void *)(&nOldLdapVersion));
    if (nRet != LDAP_SUCCESS)
    {
        cout << "Fail in ldap_get_option  !!!" << endl;
        return -1;
    }

    cout << "LDAP original Version is:" << nOldLdapVersion << endl;
   
   
    int nLdapVersion = 3;
    nRet = ldap_set_option(ldapInfo, LDAP_OPT_PROTOCOL_VERSION,(void *)( &nLdapVersion));
    if (nRet != LDAP_SUCCESS)
    {
        cout << "Fail in ldap_set_option  !!!" << endl;
        return -1;
    }

    int nNewLdapVersion = 0;
    nRet =  ldap_get_option(ldapInfo, LDAP_OPT_PROTOCOL_VERSION, (void *)(&nNewLdapVersion));
    if (nRet != LDAP_SUCCESS)
    {
        cout << "Fail in ldap_get_option  !!!" << endl;
        return -1;
    }

    cout << "LDAP New Version is:" << nNewLdapVersion << endl;

    cout << "========================begin to search ===================" << endl;

    nRet = searchLDAP_s(ldapInfo);
    if (nRet != LDAP_SUCCESS)
    {
        cout << " Fail in searchLDAP  !!!" << endl;
        return -1;
    }

    searchLDAP_as(ldapInfo);
    if (nRet != LDAP_SUCCESS)
    {
        cout << " Fail in searchLDAP_as  !!!" << endl;
        return -1;
    }
    cout << "==========================end to search ====================" << endl;

    ldap_unbind_ext(ldapInfo, NULL, NULL);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值