WindowsのADSIを使用して、LDAPサーバからアドレスデータを取得するコード
WindowsではADSI(winldap32.dll)というやつが用意されているので、これでLDAPのアクセスを行う。
LDAPサーバに格納したinetOrgPersonから、全アドレスの電話番号、名前、グループ名称を取得する
LDAPに格納されたデータは、base64化されていたり、文字コードがutf-8だったりする(RFC)が、base64のデコードや、utf-8からの変換を、勝手にやってくれるので便利
wldap32.libをリンカに追加しておくこと
#include "StdAfx.h" #include <winldap.h> using namespace std; int main(void) { LDAP *ld; LDAPMessage* pMsg = NULL; if ( ( ld = ldap_open( "192.168.1.1", LDAP_PORT ) ) == NULL ) { printf("ldap_open error"); return -1; } const PCHAR SEARCH_BASE= "ou=sample,o=example,dc=test,dc=com"; const PCHAR ATTRIBUTE_CN = "cn"; const PCHAR ATTRIBUTE_Phone = "telephoneNumber"; const PCHAR ATTRIBUTE_OU = "ou"; //タイムアウト l_timeval tm; tm.tv_sec = 0; tm.tv_usec = 5*1000*1000; // LDAPサーチ if ( ldap_search_st( ld, SEARCH_BASE, LDAP_SCOPE_SUBTREE, NULL, NULL, 0,&tm, &pMsg ) != LDAP_SUCCESS ) { ldap_perror(ld, "ldap_search_s"); ldap_unbind ( ld ); _error_msg = "ldap_search_st timeout"; return -2; } if ( pMsg == NULL ) { _error_msg = "ldap_search_s returns NULL result."; ldap_unbind ( ld ); return -3; } //カウント int nCount = ldap_count_entries( ld, pMsg ); if ( nCount <= 0 ) { ldap_msgfree( pMsg ); ldap_unbind (ld ); return -4; } parray_address->reserve(nCount);//効率化 // Get each entry LDAPMessage* pEntry; for ( pEntry = ldap_first_entry( ld, pMsg ); pEntry != NULL ; pEntry = ldap_next_entry( ld, pEntry ) ) { char** ppszPhone = NULL; char** ppszCn = NULL; char** ppszOu = NULL; ppszPhone = ldap_get_values( ld, pEntry, ATTRIBUTE_Phone ); if(ppszPhone == NULL){ continue; }else if(ppszPhone[0] == NULL){ ldap_value_free( ppszPhone ); continue; } ppszCn = ldap_get_values( ld, pEntry, ATTRIBUTE_CN ); if(ppszCn == NULL){ ldap_value_free( ppszPhone ); continue; }else if(ppszCn[0] == NULL){ ldap_value_free( ppszPhone ); ldap_value_free( ppszCn ); continue; } ppszOu = ldap_get_values( ld, pEntry, ATTRIBUTE_OU ); if(ppszOu == NULL){ ldap_value_free( ppszPhone ); ldap_value_free( ppszCn ); continue; }//グループは空を許可 printf("telnumber = %s\n",ppszPhone[0]); printf("name = %s\n",ppszCn[0]); printf("group = %s\n",ppszOu[0]); //文字列解放 if(ppszPhone){ ldap_value_free( ppszPhone ); } if(ppszCn){ ldap_value_free( ppszCn ); } if(ppszOu){ ldap_value_free( ppszOu ); } } //解放 ldap_msgfree( pMsg ); ldap_unbind ( ld ); return 0; }