Иностранные символы и LDAP. Какую кодировку / кодировку ожидает LDAP?
Я анализирую XML, с simplexml_load_string() и использование данных в нем для обновления объектов Active Directory (AD) через LDAP.
Bìlbö Bággįnš Gãńdåłf Thê Gręât Śām Wīšë
Я в первую очередь запускаю ldap_search() найти одного пользователя, а затем приступить к изменению его атрибутов. Закачка вышеуказанных значений прямо в AD с использованием LDAP приведет к появлению некоторых изуродованных символов.
Я пробовал следующие функции, но безрезультатно:
utf8_encode($str); utf8_decode($str); iconv("UTF-8", "ISO-8859-1//TRANSLIT", $str); iconv("UTF-8", "ASCII//TRANSLIT", $str); iconv("UTF-8", "T.61", $str);
В идеале я не хочу делать ни одно из этих преобразований строк. UTF-8 должно быть хорошо, правда?!
Я также заметил следующее: я распечатал значения, чтобы увидеть, как они получаются. скручивание скрипта в CLI покажет правильные символы, но веб-браузеры показывают то же, что и AD.
В чем дело? Должен ли я смотреть на что-то еще, например. Кодировка URL? Я надеюсь, что это просто ошибка с моей стороны.
РЕДАКТИРОВАТЬ: я ввел в эти символы с помощью интерфейса администратора AD, чтобы посмотреть, как они будут выходить. Я могу читать их через LDAP нормально. Правильные символы отображаются в браузере. скручивание через CLI будет показывать вопросительные знаки вместо иностранных символов. Передача одного из этих возвращаемых значений в mb_detect_encoding() вернет UTF-8.
Я решил немедленно изменить тот же объект, не записывая новую строку, а просто переворачивая существующее значение и сохраняя объект. Это прекрасно работает — я вижу правильное значение (обратное) в AD.
- Разработка на Mac OS X 10.7 Lion — PHP 5.4.3
- Запуск производства на: Red Hat 6 — PHP 5.4.3
- AD сервер: Windows 2003
ОБНОВЛЕНИЕ: Через несколько месяцев я не смог найти ответ / решение этой проблемы. В конце концов, я пошел с заменой символов на их не акцентированный эквивалент (я знаю, НЕ идеал).
Php ldap utf 8
Если у вас не работает один из способов авторизации, сконвертируйте свой аккаунт по ссылке
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
В PHP требуется только модуль php_ldap.dll, поcмотрите, он входит в состав полной версии PHP.
Поключаете его в php.ini и далее можете пользоваться ldap-функциями. Привожу простой пример, с которого я сам начал:
// Работа с Active Directory // Изменение кодировки из UTF-8 в Windows-1251 function utf2win( $mes ) return mb_convert_encoding($mes, "WINDOWS-1251", "UTF-8"); >; // Получение пользователей из Active Directory function get_AD_users() $ldap_user = "Administrator"; // username $ldap_pass = "пароль_админа"; // associated password $domain_name = "mydomain.com"; // Имя домена $domain1 = "mydomain"; $domain2 = "com"; // Служебные пользователи, которых не надо показывать $ignore_list = array("Guest","IWAM_SERVER","IUSR_SERVER","USER1CV8SERVER","Administrator"); // Connect to LDAP server $ldap_con = ldap_connect($domain_name) or die("Could not connect to LDAP server."); // Fix for Windows 2003 AD ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0); // binding to LDAP server $ldapbind = ldap_bind($ldap_con, $ldap_user, $ldap_pass) or die("LDAP bind failed. "); $base_dn = "DC=$domain1, DC=$domain2"; $filter = "(&(objectClass=user)(objectCategory=person)(|(name=*)(displayname=*)(cn=*)))"; $search=ldap_search($ldap_con, $base_dn, $filter); $number_returned = ldap_count_entries($ldap_con,$search); // Количество пользователей $info = ldap_get_entries($ldap_con, $search); // Результирующий массив с пользователями из AD $users = array(); for ($i=0; $i$info["count"]; $i++) $user = array(); $user["login"] = utf2win($info[$i]["samaccountname"][0]); $user["fio"] = utf2win($info[$i]["name"][0]); $tmp = explode(" ",$user["fio"]); $user["last"] = trim($tmp[0]); // Фамилия $user["first"] = @trim($tmp[1]); // Имя $user["second"] = @trim($tmp[2]); // Отчество if(!in_array($user["login"],$ignore_list)) $users[$user["login"]] = $user; >; > return $users; >; ?>
Спасиба я разобрался как AD пролистать на C#, вот искал на PHP видимо нашел
using System;
using System.DirectoryServices;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
class Program
private static DirectorySearcher searcher;
private static SearchResultCollection resultA;
static void Main(string[] args)
try
searcher = new DirectorySearcher(new DirectoryEntry(«LDAP://ххх.ххх.х.х»));
foreach (SearchResult result in resultA)
foreach (string key in result.Properties.PropertyNames)
Console.WriteLine(key + » \t» + cl);
>
>
>
>
catch (Exception ex)
Console.Write(«Error 0x01: «+ex.Message);
Console.ReadLine();
return;
>
Console.WriteLine(«Programm finished. «);
Console.ReadLine();
>
>
>