powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Можно ли редактировать объекты в LDAP по их objectGUID?
2 сообщений из 2, страница 1 из 1
Можно ли редактировать объекты в LDAP по их objectGUID?
    #40085305
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Уважаемые!

Пишу тут интеграцию с Win-доменом, и всё отлично - поиск работает, всё хорошо. Но вот когда дошёл до необходимости править атрибуты объектов AD'а из приложения на php - столкнулся с проблемой русских букв, которые там повсюду. И в OU, и в именах аккаунтов встречаются.

Т.е. иллюстрация проблемы:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
//Выбираем набор требуемых объектов из AD'а
$result   = ldap_search($ldapConn, 'DC=myAD,DC=local', $srchStr);
$entries  = ldap_get_entries($ldapConn, $result);

//Если получен ровно 1 объект, то правим какой-то его аттрибут
$count    = intval( $entries['count'] );
if($count == 1){
    $data = [  'description' => 'TEST DESCRIPTION' ];

    //Получаем DN выбранного для редактирования объекта.
    $dn   = $entries[0]['dn'];

    //Производим попытку модификации атрибута у объекта
    if(!ldap_mod_replace( $ldapConn, $dn, $data)){
        error_log('ERROR: '.ldap_error( $ldapConn ));
    } else {
        error_log('OK: '.$dn);
    }
}


Так вот в случае DN'а у объекта исключительно на английском языке:
Код: php
1.
$dn='CN=test-user,OU=Otdel,DC=myAD,DC=local';


всё происходит без проблем.

А вот в случае наличия русских букв в DN'е:
Код: php
1.
$dn='CN=test-user,OU=Русский отдел,DC=myAD,DC=local';


Выдаёт ошибку: Invalid syntax

И в лог LDAP'а сыплется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ldap_chkResponseList ld 0x55b51a857d60 msgid 4 all 1
ldap_chkResponseList returns ld 0x55b51a857d60 NULL
ldap_int_select
read1msg: ld 0x55b51a857d60 msgid 4 all 1
read1msg: ld 0x55b51a857d60 msgid 4 message type modify
read1msg: ld 0x55b51a857d60 0 new referrals
read1msg:  mark request completed, ld 0x55b51a857d60 msgid 4
request done: ld 0x55b51a857d60 msgid 4
res_errno: 21, res_error: <00000057: LdapErr: DSID-0C090FF9, comment: Error in attribute conversion operation, data 0, v4563>, res_matched: <>
ldap_free_request (origid 4, msgid 4)
ldap_parse_result
ldap_msgfree
ldap_err2string
ldap_err2string
ldap_msgfree
ldap_free_connection 1 1
ldap_send_unbind
ldap_free_connection: actually freed

Так вот у меня к знающим в интеграции с AD'ом - подскажите или путь как имеющийся DN преобразовать в подходящий для обращения к объекту, либо может есть способ редактирования объектов по их GUID'ам?

Т.е. я без проблем получаю GUID объекта, и если можно было б с его помощью указывать редактируемый объект - то было бы здорово.

Вроде есть однозначное решение - генерировать ldif файл, но это самый крайний случай. Из php генерировать ldif, потом запускать его обработку - звучит чересчур костыльно.

Помогите пожалуйста советом!
...
Рейтинг: 0 / 0
Можно ли редактировать объекты в LDAP по их objectGUID?
    #40085350
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем отпишусь тут.
На самом деле упиралось всё в пустой атрибут который я устанавливал. Т.е. русские символы в OU и в CN - не влияют на работу.
При условии что для соединения установлены параметры:
Код: php
1.
2.
3.
ldap_set_option($ldapConn, LDAP_OPT_DEBUG_LEVEL, 127);
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);



А проблема была в формировании массива атрибутов для смены/установки. Тут я написал так:
Код: php
1.
$data = [  'description' => 'TEST DESCRIPTION' ];


Чтобы чисто проиллюстрировать проблему без лишних деталей, а на самом деле у меня в коде было:
Код: php
1.
$data = [  'description' => $userObj->getUserDescription() ];


И вот как раз описание выдаваемое ->getUserDescription() было пустым, а в этом LDAP'е пустое значение должно указываться как пустой массив. Т.е. решением оказалось:
Код: php
1.
2.
3.
4.
5.
if( !mb_strlen(trim(($userDescr = $userObj->getUserDescription())) ){
    $data = [ 'description' => [] ];
} else {
    $data = [ 'description' => $userDescr ]; //Можно и ... => [ $userDescr ] ]; 
}
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Можно ли редактировать объекты в LDAP по их objectGUID?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]