2013-11-29 1 views
0

У меня здесь есть сервер Windows Server 2008r2 с Active Directory, DNS, DHCP и DC для тестирования, и я довольно новичок в LDAP.PHP LDAP Windows 2008r2 Изменение пароля пользователей

Я хочу изменить пароль для себя, даже если я не admin.

Итак, вот мой сценарий я работаю прямо сейчас:

// LDAP Variables 
$serverip = "192.168.2.1"; 
$serverport = 636; 
$username = "user"; 
$userpassword = "password1"; 
$newpass = "password2"; 
$userDn = "CN=$username,CN=Users,DC=dc-name"; 

$ldapconn = ldap_connect($serverip, $serverport) or die("LDAP Connection Failed!\n"); 
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); 
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); 
if ($ldapconn) { 
    echo "Connection succeded\n"; 
    // LDAP Bind 
    $bindresult = ldap_bind($ldapconn, $username, $userpassword); 
    if ($bindresult) { 
     echo "Bind: Succeded\n"; 
     $userData['unicodePwd'] = toPwEntry($newpass); 
     $modresult = ldap_mod_replace($ldapconn, $userDn , $userData); 
     if (!$modresult) echo "PW Change Failed - Error No. ". ldap_errno($ldapconn).": " .ldap_error($ldapconn) . "\n"; 
    } 
    else echo "Bind Failed - Error No. ". ldap_errno($ldapconn).": " .ldap_error($ldapconn) . "\n"; 
} 
else echo "Connection failed - Error No. ". ldap_errno($ldapconn).": " .ldap_error($ldapconn) . "\n";  

function toPwEntry($pw) { 
    return("\"". iconv('UTF-8','UTF-16LE',$pw) ."\""); 
} 
ldap_close($ldapconn); 

, когда я запустить скрипт я получаю эту ошибку:

[email protected]:~/Desktop/$ php ldap.php 
Connection succeded 
Bind Failed - Error No. -1: Can't contact LDAP server 

я также попытался соединения с помощью «LDAPS: // "перед ip, но он не работает. Я был бы признателен за любую помощь!

+0

Проверьте, что ваш сервер AD прослушивает порт 636 – Chelseawillrecover

ответ

0

Несколько предложений:

ldap_bind() хочет $userDN, а не $username. Однако это приведет к другому сообщению об ошибке.

Нет фактического сетевого трафика между вашим веб-сервером и сервером ldap, пока вы не вызовете ldap_bind(), поэтому убедитесь, что нет проблем с брандмауэром/сетью и т. Д. Сообщение об ошибке «Не удается связаться с сервером»; это может быть именно то, что происходит. (Функция ldap_connect() только инициализирует локальную структуру в более поздних версиях библиотек ldap. Вы можете подумать об этом больше как «ldap_init()» - сообщение «Connection Successed» не означает успешное сетевое подключение здесь.)

Вы можете настроить LDAP-сервер для обработки как безопасных, так и небезопасных подключений на 389 вместо 636. Убедитесь, что вы подключаетесь к тому месту, где ожидает вас сервер.

Эти симптомы могут также отображаться, если ваш конец TLS-соединения не может проверить сертификат сервера. Вам либо необходимо предоставить доверенные корневые сертификаты, либо настроить клиент для проверки сертификата (например, если у сервера есть самозаверяющий сертификат). Любой из них можно выполнить, установив переменные в файле ldap.conf. Где положить ldap.conf зависит от настройки вашего веб-сервера.

Это: http://www.novell.com/coolsolutions/tip/5838.html и для этого: http://www.whatsnoodle.com/php-ldap_bind-gives-the-error-cant-contact-ldap-server/ может иметь больше деталей для вас.

0

Active Directory позволит вам сменить пароль через LDAPS, и я уверен, что вам нужно использовать порт 636.
Когда вы укажете LDAPS: // попробуйте в верхнем регистре. По меньшей мере один из прокси-серверов MS-провайдера чувствителен к регистру. Я не совсем уверен, что это LDAP; Я использовал колпачки для всех прозвищ в течение многих лет.
Ваш пароль, я думаю, должен быть октетной строкой (байтовый массив). Я не могу читать PHP, поэтому я не могу сказать, что это то, что вы делаете, но я так думаю.
Для вашего контроллера домена потребуется сертификат LDAPS. Я не эксперт по сертификатам, но я думаю, что имя, которое вы используете для сервера, должно совпадать с именем в сертификате, и обычно это не IP-адрес (хотя я думаю, что вы можете поместить их в альтернативные имена в сертификате), поэтому я думаю, что вы следует использовать имя сервера.