Example Code for Displaying Extended Controls Support

The following code example queries an LDAP server for extended control support, and prints a list to the console window. If an error occurs it prints the hex value of the LDAP error instead. For more information and a list of error code values, see Return Values.

//  Add Wldap32.lib to your project.
//  Add Wldap32.dll to your project.

#ifndef _UNICODE
#define _UNICODE
#endif
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "winldap.h"
const size_t newsize = 100;

//  ULONG GetSupportedLdapControls(PCHAR hostName, PCHAR** ppValList)
//       [in] hostName      LDAP server name
//       [out] ppValList    Null-terminated array of control OIDs.
//
//  This function queries an LDAP server for a list of its
//  supported extended controls. If successful, it returns
//  LDAP_SUCCESS and an array of control OIDs.
//
//  The array returned in the pValList pointer must be freed with
//  ldap_value_free() when no longer required.
ULONG GetSupportedLdapControls(PWCHAR hostName, PWCHAR** ppValList)
{
    ULONG version = LDAP_VERSION3;
    ULONG returnCode = LDAP_SUCCESS;;
    LDAP* pLdapConnection = NULL;
    LDAPMessage* pMessage = NULL;
    LDAPMessage* pEntry = NULL;
    INT connectSuccess = 0;

    //  Initialize return value to NO CONTROLS SUPPORTED
    *ppValList = NULL;

    while(1)
    {
        //  Initialize a new LDAP session.
        pLdapConnection = ldap_init(hostName,LDAP_PORT);
        if(pLdapConnection == NULL)
        {
            returnCode = LdapGetLastError();
            if(returnCode == LDAP_SUCCESS)
                returnCode = LDAP_OTHER;
            break;
        }

        //  Use Version 3 support.
        returnCode = ldap_set_option(pLdapConnection,LDAP_OPT_VERSION,(void*)&version);
        if(returnCode != LDAP_SUCCESS)
            break;

        //  Connect to the server.
        connectSuccess = ldap_connect(pLdapConnection, NULL);
        if(connectSuccess != LDAP_SUCCESS)
            break;

        //  Bind with current credentials.
        returnCode = ldap_bind_s(pLdapConnection,NULL,NULL,LDAP_AUTH_NEGOTIATE);
        if (returnCode != LDAP_SUCCESS)
            break;

        //  Get the RootDSE attributes.
        returnCode = ldap_search_s(pLdapConnection,
                                   L"",
                                   LDAP_SCOPE_BASE,
                                   L"(objectClass=*)",
                                   NULL,
                                   0,
                                   &pMessage);
        if(returnCode != LDAP_SUCCESS)
            break;

        //  Return the support controls.
        pEntry = ldap_first_entry(pLdapConnection, pMessage);
        if(pEntry != NULL)
        {
            *ppValList = ldap_get_values(pLdapConnection,
                                         pEntry,
                                         L"supportedControl");
            break;
        }
        //  Perform cleanup.
        if(pMessage != NULL)
            ldap_msgfree(pMessage);
        if(pLdapConnection != NULL)
            ldap_unbind_s(pLdapConnection);
        return returnCode;
    }
}

//  Entry point for application
int main(int argc, char* argv[])
{
    PWCHAR* pValueList;
    ULONG returnCode;
    PWCHAR hostName = NULL;

    if (argc > 1)
    {
        //  Convert argv[] to a wchar_t*
        size_t origsize = strlen(argv[1]) + 1;
        const size_t newsize = 100;
        size_t convertedChars = 0;
        wchar_t wcstring[newsize];
        mbstowcs_s(&convertedChars, wcstring, origsize, argv[1], _TRUNCATE);
        wcscat_s(wcstring, L" (wchar_t *)");
        hostName = wcstring;
    }

    //  Use the function to retrieve a list of control OIDs.
    returnCode = GetSupportedLdapControls(hostName, &pValueList);
    if(returnCode == LDAP_SUCCESS)
    {
        PWCHAR* pV = pValueList;
        printf("Extended Controls Supported:\n");
        while(*pV)
        {
            printf("    %s\n",*pV);
            pV++;
        }
        if(pValueList != NULL)
            ldap_value_free(pValueList);
    }
    else
        printf("ERROR: code = 0x%0lX\n",returnCode);
    return 0;
}