简体   繁体   中英

ldap “The search filter is bad.” error from MSDN c++ example

i running a LDAP example in c++ from MSDN . 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:

            #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;
            };

The problems relays on ANSII character Set. I set the project to Multi-Byte set and restructure the code to that selection.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM