eDirectoryにはLDAP拡張DNコントロールが備わっています。このコントロールは、識別名オブジェクトの拡張フォームを要求するために、拡張LDAP検索で使用しjます。この拡張フォームには、オブジェクトGUIDの文字列表現と、オブジェクトの識別名が含まれます。
eDirectoryサーバでLDAP拡張DNコントロール機能を使用するには、管理者は拡張LDAP検索要求でLDAP拡張DNコントロールのOID1.2.840.113556.1.4.529を指定する必要があります。
拡張DNコントロールによって、クライアントは、このコントロールを使用するLDAP検索によって返される結果に、オブジェクトのGUIDデータと、distinguishedNameオブジェクトが含まれるように要求できます。次のように返されます。
<GUID=xxxxxxxx>;distinguishedName
xxxxxxxxはGUIDが含まれる文字列、distinguishedNameはDN(例: cn=users,dc=fabrikam,dc=com)です。
LDAP拡張DNコントロールは、整数のフラグ値も渡すことができます。渡されるフラグ値によって、返されるGUID値の文字列形式が決まり、次のBERエンコードシーケンスに設定されます。
Sequence {
Flag INTEGER
}
フラグ値0の場合、GUID値は16進数文字列形式で返されます。例: <GUID=3BC72D2DEC5A704BBDC21F4EF97B7870>
フラグ値1の場合、標準文字列形式でGUID値が返されます。例: <GUID=098f2470-bae0-11cd-b579-08002b30bfeb>
一部としてDNが含まれるeDirectoryのデータタイプには複雑なものもいくつかあります。eDirectoryがLDAP拡張DNコントロールで処理する複雑なデータタイプは以下のみです。
SYN_PATH (volumeDNのGUIDが返されます)
SYN_DN
SYN_TYPED_NAME
メモ:前述の複雑なデータタイプが含まれる拡張DNコントロールを使用する場合、LDAP検索のパフォーマンスが影響を受けます。
次のC++コード例は、シーケンスデータを手動でフォーマットする方法を示しています。ber_printf関数を使用してシーケンスデータを作成します。フラグ部分には、GUID文字列の書式指定子が含まれます。
LDAPControl *FormatExtDNFlags(int iFlagValue)
{
BerElement *pber = NULL;
LDAPControl *pLControl = NULL;
berval *pldctrl_value = NULL;
int success = -1;
// Ensure that iFlagValue is either 0 or 1. Convert TRUE (-1) to a legal value.
if(iFlagValue != 0)
iFlagValue = 1;
// Format and encode the SEQUENCE data in a BerElement.
pber = ber_alloc_t(LBER_USE_DER);
if(pber==NULL) return NULL;
pLControl = new LDAPControl;
if(pLControl==NULL) { ber_free(pber,1); return NULL; }
ber_printf(pber,"{i}",iFlagValue);
// Transfer encoded data into a BERVAL.
success = ber_flatten(pber,&pldctrl_value);
ber_free(pber,1);
if(success != 0) {return NULL;}
// Copy the BERVAL data to the LDAPControl structure.
pLControl->ldctl_oid = LDAP_SERVER_EXTENDED_DN_OID;
pLControl->ldctl_iscritical = true;
pLControl->ldctl_value.bv_val = new char[pldctrl_value->bv_len];
memcpy(pLControl->ldctl_value.bv_val,
pldctrl_value->bv_val, pldctrl_value->bv_len);
pLControl->ldctl_value.bv_len = pldctrl_value->bv_len;
// Cleanup temporary berval.
ber_bvfree(pldctrl_value);
// Return formatted LDAPControl data.
return pLControl;
}
次のC++コード例は、拡張DNコントロールとldap_search_ext_s関数を併用する方法について示しています。
int err;
LDAP *ldapConnection = NULL;
LDAPControl *pExtDNControl;
LDAPControl *controlArray[2];
LDAPMessage *results = NULL;
LDAPMessage *message = NULL;
char *dn = NULL;
// Connect to the default LDAP server.
ldapConnection = ldap_open( NULL, 0 );
if ( ldapConnection == NULL ) goto FatalExit0;
// Bind to the server using default credentials.
err = ldap_simple_bind_s( ldapConnection, NULL, NULL);
if (LDAP_SUCCESS != err) goto FatalExit0;
// Setup the extended DN control, requesting 'standard string' format.
pExtDNControl = FormatExtDNFlags(1);
if (pExtDNControl == NULL) goto FatalExit0;
controlArray[0] = pExtDNControl;
controlArray[1] = NULL;
// Perform a synchronous search.
err = ldap_search_ext_s( ldapConnection,
"cn=users,dc=Fabrikam,dc=com",
LDAP_SCOPE_SUBTREE,
"objectClass=*",
NULL, // Retrieve all attributes.
0, // Retrieve attributes and values.
(LDAPControl **) &controlArray,
NULL, // Client controls.
0, // Timeout.
0, // Sizelimit.
&results // Receives identifier for results.
);
if (LDAP_SUCCESS != err) goto FatalExit0;
// Process the search results.
message = ldap_first_entry( ldapConnection, results );
while (message != NULL)
{
// Print the distinguished name of the object.
dn = ldap_get_dn( ldapConnection, message );
if (!dn) goto FatalExit0;
printf( " Distinguished Name is : %s\n", dn );
ldap_memfree(dn);
message = ldap_next_entry( ldapConnection, message );
}
FatalExit0:
if (ldapConnection)
ldap_unbind( ldapConnection );
if (results)
ldap_msgfree( results );
}