xieo0c 发表于 2009-4-28 17:08:59

关于ldap问题 困扰啊。~~

我刚开始学习ldap的编程,想通过LDAP编程获得winmail 服务器上的公共地址薄上的信息,但是我不知道为什么绑定不上ldap 总是绑定失败,返回:0x07错误。C语言的。然后代码是从微软的MSDN上找的。我已经获得了exchange 服务器上的地址薄信息,但是winmail 为什么不行呢? 我觉得是那个dn错误了。但是我的winmail 的域名就是love.com啊!!! 但是就是绑定不成功!! 郁闷哦!! 高手指点下。
代码如下:
#pragma    comment(lib,"wldap32.lib")
#include <windows.h>
#include <winldap.h>
#include <winber.h>
#include <rpcdce.h>
#include <stdio.h>
//-----------------------------------------------------------
// This subroutine must have validated credentials (name and
// password) passed to it.
//-----------------------------------------------------------
int main()
{
    //---------------------------------------------------------
    // Initialize a session. LDAP_PORT is the default port, 389.
    //---------------------------------------------------------
PCHAR pUserName="";
PCHAR pPassword="";
    PCHAR hostName = "192.168.16.155";
    LDAP* pLdapConnection = NULL;
   
    pLdapConnection = ldap_init(hostName, LDAP_PORT);
   
if (pLdapConnection == NULL)
    {
      printf("ldap_init failed with 0x%x.\n",LdapGetLastError());
      ldap_unbind(pLdapConnection);
      return -1;
    }
    else
      printf("ldap_init succeeded \n");
   
   
    //-------------------------------------------------------
    // Set session options.
    //-------------------------------------------------------
    ULONG version = LDAP_VERSION3;
    ULONG numReturns = 10;
    ULONG lRtn = 0;
   
    // Set the version to 3.0 (default is 2.0).
    lRtn = ldap_set_option(
                  pLdapConnection,         // Session handle
                  LDAP_OPT_PROTOCOL_VERSION, // Option
                  (void*) &version);         // Option value
    if(lRtn == LDAP_SUCCESS)
      printf("ldap version set to 3.0 \n");
    else
    {
      printf("SetOption Error:%0lX\n", lRtn);
      ldap_unbind(pLdapConnection);
      return -1;
    }
    // Set the limit on the number of entries returned to 10.
    lRtn = ldap_set_option(
                  pLdapConnection,       // Session handle
                  LDAP_OPT_SIZELIMIT,    // Option
                  (void*) &numReturns);// Option value
    if(lRtn == LDAP_SUCCESS)
      printf("Max return entries set to 10 \n");
    else
    {
      printf("SetOption Error:%0lX\n", lRtn);
      ldap_unbind(pLdapConnection);
      return -1;
    }
   
   
    //--------------------------------------------------------
    // Connect to the server.
    //--------------------------------------------------------
   
    lRtn = ldap_connect(pLdapConnection, NULL);
   
    if(lRtn == LDAP_SUCCESS)
      printf("ldap_connect succeeded \n");
    else
    {
      printf("ldap_connect failed with 0x%lx.\n",lRtn);
      ldap_unbind(pLdapConnection);
      return -1;
    }
   
   
    //--------------------------------------------------------
    // Bind with credentials.
    //--------------------------------------------------------
PCHAR pMyDN = "dc=love,dc=com";
    SEC_WINNT_AUTH_IDENTITY secIdent;

    secIdent.User = NULL;
    secIdent.UserLength = strlen(pUserName);
    secIdent.Password = NULL;
    secIdent.PasswordLength = strlen(pPassword);
    secIdent.Domain = (unsigned char*)hostName;
    secIdent.DomainLength = strlen(hostName);
    secIdent.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;

    lRtn = ldap_bind_s(
                pLdapConnection,      // Session Handle
                pMyDN,                // Domain DN
                (PCHAR)&secIdent,   // Credential structure
                LDAP_AUTH_NEGOTIATE); // Auth mode
/** lRtn =ldap_simple_bind_s(
                pLdapConnection,      // Session Handle
                pMyDN,                // Domain DN
    NULL);
**/

    if(lRtn == LDAP_SUCCESS)
    {
      printf("ldap_bind_s succeeded \n");
      secIdent.Password = NULL; // Remove password pointer
      pPassword = NULL;         // Remove password pointer
    }
    else
    {
      printf("ldap_bind_s failed with 0x%lx.\n",lRtn);
      ldap_unbind(pLdapConnection);
      return -1;
    }

    //----------------------------------------------------------
    // Perform a synchronous search of fabrikam.com for
    // all user objects that have a "person" category.
    //----------------------------------------------------------
    ULONG errorCode = LDAP_SUCCESS;
    LDAPMessage* pSearchResult;
    PCHAR pMyFilter = "(&(objectCategory=person)(objectClass=user))";
    PCHAR pMyAttributes;
    pMyAttributes = "cn";
    pMyAttributes = "company";
    pMyAttributes = "department";
    pMyAttributes = "telephoneNumber";
    pMyAttributes = "memberOf";
    pMyAttributes = NULL;
   
    errorCode = ldap_search_s(
                  pLdapConnection,    // Session handle
                  pMyDN,            // DN to start search
                  LDAP_SCOPE_SUBTREE, // Scope
                  pMyFilter,          // Filter
                  pMyAttributes,      // Retrieve list of attributes
                  0,                  // Get both attributes and values
                  &pSearchResult);    // Search results
   
    if (errorCode != LDAP_SUCCESS)
    {
      printf("ldap_search_s failed with 0x%0lx \n",errorCode);
      ldap_unbind_s(pLdapConnection);
      if(pSearchResult != NULL)
            ldap_msgfree(pSearchResult);
      return -1;
    }
    else
      printf("ldap_search succeeded \n");
   
    //----------------------------------------------------------
    // Get the number of entries returned.
    //----------------------------------------------------------
    ULONG numberOfEntries;
   
    numberOfEntries = ldap_count_entries(
                        pLdapConnection,    // Session handle
                        pSearchResult);   // Search result
   
    if(numberOfEntries == NULL)
    {
      printf("ldap_count_entries failed with 0x%0lx \n",errorCode);
      ldap_unbind_s(pLdapConnection);
      if(pSearchResult != NULL)
            ldap_msgfree(pSearchResult);
      return -1;
    }
    else
      printf("ldap_count_entries succeeded \n");
   
    printf("The number of entries is: %d \n", numberOfEntries);
   
   
    //----------------------------------------------------------
    // Loop through the search entries, get, and output the
    // requested list of attributes and values.
    //----------------------------------------------------------
    LDAPMessage* pEntry = NULL;
    PCHAR pEntryDN = NULL;
    ULONG iCnt = 0;
    char* sMsg;
    BerElement* pBer = NULL;
    PCHAR pAttribute = NULL;
    PCHAR* ppValue = NULL;
    ULONG iValue = 0;
   
    for( iCnt=0; iCnt < numberOfEntries; iCnt++ )
    {
      // Get the first/next entry.
      if( !iCnt )
            pEntry = ldap_first_entry(pLdapConnection, pSearchResult);
      else
            pEntry = ldap_next_entry(pLdapConnection, pEntry);
      
      // Output a status message.
      sMsg = (!iCnt ? "ldap_first_entry" : "ldap_next_entry");
      if( pEntry == NULL )
      {
            printf("%s failed with 0x%0lx \n", sMsg, LdapGetLastError());
            ldap_unbind_s(pLdapConnection);
            ldap_msgfree(pSearchResult);
            return -1;
      }
      else
            printf("%s succeeded\n",sMsg);
      
      // Output the entry number.
      printf("ENTRY NUMBER %i \n", iCnt);
               
      // Get the firt attribute name.
      pAttribute = ldap_first_attribute(
                      pLdapConnection,   // Session handle
                      pEntry,            // Current entry
                      &pBer);            // Current BerElement
      
      // Output the attribute names for the current object
      // and output values.
      while(pAttribute != NULL)
      {
            // Output the attribute name.
            printf("   ATTR: %s",pAttribute);
            
            // Get the string values.
            ppValue = ldap_get_values(
                        pLdapConnection,// Session Handle
                        pEntry,         // Current entry
                        pAttribute);      // Current attribute
            // Print status if no values are returned (NULL ptr)
            if(ppValue == NULL)
            {
                printf(": ");
            }
            // Output the attribute values
            else
            {
                iValue = ldap_count_values(ppValue);
                if(!iValue)
                {
                  printf(": ");
                }
                else
                {
                  // Output the first attribute value
                  printf(": %s", *ppValue);
                  // Output more values if available
                  ULONG z;
                  for(z=1; z<iValue; z++)
                  {
                        printf(", %s", ppValue);
                  }
                }
            }
            // Free memory.
            if(ppValue != NULL)
                ldap_value_free(ppValue);
            ppValue = NULL;
            ldap_memfree(pAttribute);
            
            // Get next attribute name.
            pAttribute = ldap_next_attribute(
                            pLdapConnection,   // Session Handle
                            pEntry,            // Current entry
                            pBer);             // Current BerElement
            printf("\n");
      }
      
      if( pBer != NULL )
            ber_free(pBer,0);
      pBer = NULL;
    }
   
    //----------------------------------------------------------
    // Normal cleanup and exit.
    //----------------------------------------------------------
    ldap_unbind(pLdapConnection);
    ldap_msgfree(pSearchResult);
    ldap_value_free(ppValue);
    return 0;
   
}
页: [1]
查看完整版本: 关于ldap问题 困扰啊。~~