Ошибка смены пароля в Active Directory с использованием PHP - PullRequest
0 голосов
/ 07 августа 2020

Привет, добрый день, поиск по inte rnet как изменить пароль пользователя в Active Directory с помощью PHP, я обнаружил следующий код, изменяющий только доступы, но он отмечает ошибку в функции ldap_mod_replace ().

Не могли бы вы помочь мне исправить ошибку?

Я делюсь своим кодом

PHP Код

<?php

  $user_name = "(sAMAccountName=Write UserName of user whose password wants to change)"; //Dont remove parentheses brackets 
  $user_password = "NewPassword117";   

  $ldap_conn = create_ldap_connection(); 
  $userDn = get_user_dn($ldap_conn, $user_name);
  $userdata = pwd_encryption ($user_password);  
  $result = ldap_mod_replace($ldap_conn, $userDn , $userdata);  
  /* Check whether the password updated successfully or not. */ 
  if ($result)  
    die("Password changed successfully!");  
  else  
    die("Error: Please try again later!");

  function create_ldap_connection(){ 
    $ldaps_url = "MyIP"; // Example 192.168.100.1 
    $ldap_conn = ldap_connect($ldaps_url) or die("Sorry! Could not connect to LDAP server ($ip)");
    ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3);  

    $password = "MyPassword";
    $binddn = "MyUser";
    $result = ldap_bind($ldap_conn, $binddn, $password) or die("Error: Couldn't bind to server using provided credentials!");

    if($result) {
      return $ldap_conn; 
    } else {
      die (" Error: Couldn't bind to server with supplied credentials!");
    }
  }  

  function get_user_dn($ldap_conn, $user_name) {  
    /* Write the below details as per your AD setting */  
    $basedn = "DC=AD Test,DC=Local";  
    /* Search the user details in AD server */  
    $searchResults = ldap_search( $ldap_conn, $basedn, $user_name );  

    if ( !is_resource( $searchResults ) )  die('Error in search results.');
    /* Get the first entry from the searched result */  
    $entry = ldap_first_entry( $ldap_conn, $searchResults ); 
    return ldap_get_dn( $ldap_conn, $entry ); 
  }

  function pwd_encryption( $newPassword ) {  
    $newPassword = "\"" . $newPassword . "\"";
    $len = strlen( $newPassword ); 
    $newPassw = "";
    for ( $i = 0; $i < $len; $i++ ) {
      $newPassw .= "{$newPassword {$i}}\000"; 
    }

    $userdata["unicodePwd"] = $newPassw;  return $userdata; 
  }


?>

Ошибка

введите описание изображения здесь

1 Ответ

0 голосов
/ 09 августа 2020

«Нежелание выполнять» означает «Я не могу делать то, что вы меня просите». Это всегда означает, что вы сделали что-то не так. В этом случае может быть несколько вещей.

Чтобы иметь возможность изменить пароль, соединение должно быть безопасным, что можно сделать с помощью LDAPS (LDAP через SSL). Я вижу s в $ldaps_url, но ваш пример использования IP-адреса рядом не работает. Во-первых, ему должен предшествовать ldaps://, но также IP-адрес просто не работает для SSL. Имя домена, которое вы используете для подключения, должно совпадать с именем домена в сертификате SSL, который вам отправляет сервер, а сертификаты не имеют IP-адресов.

Таким образом, эта строка должна выглядеть примерно так:

$ldaps_url = "ldaps://example.com";

Или это тоже может быть формат пароля. Похоже, вы взяли код из комментариев в документации ldap_mod_replace() для форматирования пароля, но я думаю, что в документации для ldap_modify_batch() есть гораздо более простой пример:

function adifyPw($pw)
{
    return iconv("UTF-8", "UTF-16LE", '"' . $pw . '"');
}

Это означает, что вы можете изменить свою функцию pwd_encryption на это:

function pwd_encryption( $newPassword ) {  
    $userdata["unicodePwd"] = iconv("UTF-8", "UTF-16LE", '"' . $newPassword . '"');
    return $userdata; 
}
...