none
bad ldap filter error in basic search operation from MSDN example RRS feed

  • Pergunta

  • i running a LDAP example in c++ from  I posting this because I have no idea. The code connect and bind just fine, but when I run a search operation bad search filter error arise, the strange is I am running the basic filter: "(objectClass=*)" from MSDN tutorial. here is the code:

    Tanks in advance

    #include "stdafx.h"
    
    #include <windows.h>
    #include <ntldap.h>
    #include <winldap.h>
    #include <winber.h>
    #include <rpc.h>
    #include <rpcdce.h>
    #include <schnlsp.h>
    #include <stdlib.h>
    const size_t newsize = 100;
    
    int main(int argc, char* argv[])
    {
      PWCHAR hostName = NULL;
      LDAP* pLdapConnection = NULL;
      ULONG version = LDAP_VERSION3;
      ULONG getOptSuccess = 0;
      ULONG connectSuccess = 0;
      INT returnCode = 0;
      PCHAR pUserName="israel";
      PCHAR pPassword="israel";
    
      argc=2;
      argv[1]="sincronica.spo.br";
      //  Verify that the user passed a hostname.
      if (argc > 1)
      {
        //  Convert argv[] to a wchar_t*
        size_t origsize = strlen(argv[1]) + 1;
        size_t convertedChars = 0;
        wchar_t wcstring[newsize];
        mbstowcs_s(&convertedChars, wcstring, origsize, argv[1], _TRUNCATE);
        wcscat_s(wcstring, L" (wchar_t *)");
        hostName = wcstring;
      }
      else
      {
        hostName = NULL;
      }
    
      //  Initialize a session. LDAP_PORT is the default port, 389.
      pLdapConnection = ldap_init(hostName, LDAP_PORT);
    
      if (pLdapConnection == NULL)
      {
        //  Set the HRESULT based on the Windows error code.
        char hr = HRESULT_FROM_WIN32(GetLastError());
        printf( "ldap_init failed with 0x%x.\n",hr);
        goto error_exit;
      }
      else
        printf("ldap_init succeeded \n");
    
      //  Set the version to 3.0 (default is 2.0).
      returnCode = ldap_set_option(pLdapConnection,
        LDAP_OPT_PROTOCOL_VERSION,
        (void*)&version);
      if(returnCode == LDAP_SUCCESS)
        printf("ldap_set_option succeeded - version set to 3\n");
      else
      {
        printf("SetOption Error:%0X\n", returnCode);
        goto error_exit;
      }
    
      // Connect to the server.
      connectSuccess = ldap_connect(pLdapConnection, NULL);
    
      if(connectSuccess == LDAP_SUCCESS)
        printf("ldap_connect succeeded \n");
      else
      {
        printf("ldap_connect failed with 0x%x.\n",connectSuccess);
        goto error_exit;
      }
      //-------------------------------------------------------
      // Set session options.
      //-------------------------------------------------------
      ULONG numReturns = 10;
      ULONG lRtn = 0;
      //  Bind with current credentials (login credentials). Be
      //  aware that the password itself is never sent over the 
      //  network, and encryption is not used.
      printf("Binding ...\n");
      //--------------------------------------------------------
      // Bind with credentials.
      //--------------------------------------------------------
      PCHAR pMyDN = "DC=sincronia,DC=spo,DC=br";
      SEC_WINNT_AUTH_IDENTITY secIdent;
    
      secIdent.User = (unsigned short*)pUserName;
      secIdent.UserLength = strlen(pUserName);
      secIdent.Password = (unsigned short*)pPassword;
      secIdent.PasswordLength = strlen(pPassword);
      secIdent.Domain = (unsigned short*)hostName;
      secIdent.DomainLength = strlen((char*)hostName);
      secIdent.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
    
      lRtn = ldap_bind_s(
        pLdapConnection,      // Session Handle
        (PWCHAR)pMyDN,         // Domain DN
        (PWCHAR)&secIdent,     // Credential structure
        LDAP_AUTH_NEGOTIATE); // Auth mode
      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 = "(objectClass=*)";
    
      errorCode = ldap_search_s(
        pLdapConnection,    // Session handle
        (PWCHAR)pMyDN,      // DN to start search
        LDAP_SCOPE_BASE,    // Scope
        (PWCHAR)pMyFilter,  // Filter
        NULL,               // Retrieve list of attributes
        0,                  // Get both attributes and values
        &pSearchResult);    // [out] 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");
      //  Normal cleanup and exit.
      ldap_unbind(pLdapConnection);
      return 0;
    
      //  On error cleanup and exit.
    error_exit:
      ldap_unbind(pLdapConnection);
      return -1;
    };
    

    quarta-feira, 25 de novembro de 2015 12:23