braintag

公開してしまう備忘録

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