LDAP에서 바이너리 데이터 처리

LDAP (AD, Openldap 등) 에서 text, 숫자는 검색하여 바로 볼 수 있지만 binary string 은 별도의 처리가 필요하다.

ldap_search 한것을 ldap_get_entries 를 이용하여 가져오지 않고 ldap_first_entry 를 이용하고 가져오고 ldap_get_values_len 를 이용하여 무언가 바이너리 데이터의 크기?를 구하고 bin2hex 를 이용하여 바이너리 포맷을 출력할 수 있는 포맷으로 변경을 하는 듯 합니다.

http://www.php.net/manual/en/book.ldap.php
ldap_get_values_len — Get all binary values from a result entry
ldap_get_values — Get all values from a result entry

바이너리 데이터를 가져오기 위해서는 ldap_get_values_len 를 이용한다. http://www.php.net/manual/en/function.ldap-get-values-len.php 를 보면 이에 대해서 상세한 예제가 있다.

ldap_get_values 나 ldap_get_values_len 에서 리턴하는 자료는 array 로 나온다.

하나의 attribute 에 대하여 여러개의 엔트리가 있을 수 있다.

    return_value["count"] = number of values for attribute
    return_value[0] = first value of attribute
    return_value[i] = ith value of attribute

bin2hex 는 바이너리 데이터를 ASCII string 으로 바꾸어준다.
bin2hex — Convert binary data into hexadecimal representation http://www.php.net/manual/en/function.bin2hex.php

소스 출처 WDS AD 에서 바이너리 데이터 가져오기 PHP 프로그램

#!/usr/bin/php -q
<?php

$rootdn="CN=Computers,dc=WDS,dc=TEST";
$ldaphost="ldap://wds.test";
$userdn="administrator@wds.test";
$password="xxxx";
$cn="test2";

$ad=ldap_connect($ldaphost) or die("Couldn't connect to $ldaphost!");
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
$bd=ldap_bind($ad,$userdn,$password) or die("Couldn't bind to AD!");

$justthese=array("cn","netbootMachineFilePath","netbootGUID");

$filter="cn=$cn";

$sr=ldap_search($ad, $rootdn, $filter, $justthese) or die("Couldn't search to AD!");

$count=ldap_count_entries($ad, $sr);

if($count < 1) {
        echo "$cn not found.\n";
        exit;
}

// attribute 는 소문자로 사용해야 함
$entry=ldap_first_entry($ad,$sr);
$name=ldap_get_values($ad, $entry, "cn");
$netbootmachinefilepath=ldap_get_values($ad, $entry, "netbootmachinefilepath");
$bin_netbootguid=ldap_get_values_len($ad,$entry,"netbootguid");
$netbootguid=bin2hex($bin_netbootguid[0]);
$netbootguid=substr($netbootguid,20);

echo "cn : ". $name[0] . "\n";
echo "netbootmachinefilepath : ". $netbootmachinefilepath[0] . "\n";
echo "netbootguid : " . $netbootguid . "\n";

ldap_close($ad);
?>

관련자료

http://forums.windrivers.com/showthread.php?t=71265

$USER_ID = "USER@MYDOMAIN";
$PWD = "PASSWORD";
$dn = "OU=Users,DC=MYDOMAIN";
$ad = ldap_connect("ldap://SERVER.MYDOMAIN")
      or die("Couldn't connect to AD!");
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
$bd = ldap_bind($ad,$USER_ID,$PWD)
      or die("Couldn't bind to AD!");
$filter = "samaccountname=SOMEREALUSERNAME"; //real user name
$result = ldap_search($ad, $dn,$filter);
$entry=ldap_first_entry($ad,$result);
$name = ldap_get_values($ad, $entry, "samaccountname");
print_r($name); 

$hoursbinary=ldap_get_values_len($ad,$entry,"logonhours");
$hourshex=bin2hex($hoursbinary[0]);
print "hours: ".$hourshex."<br>"; 

 

기타

검색방법이 좀 다르기에 추가 정보를 입력한다.
for 과 ldap_next_entry 를 이용하여 전체 데이터를 처리하면 될 것이다.

http://www.php.net/manual/en/function.ldap-first-entry.php

Here's a nice way to user ldap_first_entry,ldap_next_entry.

$res = ldap_search($ldapc,$searchroot,$filter,$attributes);
for ($entryID=ldap_first_entry($ldapc,$res);
            $entryID!=false;
            $entryID=ldap_next_entry($ldapc,$entryID))
{
// Do stuff with the $entryID.
$values = ldap_get_values($ldapc,$entryID,'uid');
}