欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

自己亲自做的 php 使用 ldaps 修改 ad 密码 (使用 ldaps 来连接 AD服务器)(使用 ldap 不能修改密码 ( ldaps 端口 636 ) 有大用 有大大用 有大大大用 有大大大大用

我使用的是   linux 服务器 LAMP

如果没有配置 ldap.conf的话,那么可能 ldap能连接上,但是ldaps 就会报 Can't contact LDAP server 的错



1)安装 openldap (linux的apache上要支持 ldap 必须安装它 openldap  )

/node-admin/16720      /node-admin/16721


2) 在 /etc/openldap/ldap.conf  中 

...................

TLS_CACERTDIR   /etc/openldap/certs

#TLS_CACERT /etc/openldap/cacerts/Root.pem

TLS_REQCERT never # 这是最重要的一行表示不使用 ssl 认证

# Turning this off breaks GSSAPI used with krb5 when rdns = false

SASL_NOCANON    on

...................

奇了怪了,非要在 /etc/openldap/certs 目录下面加上这几个好像没用的文件才行??

image.png

3) php 代码 


<?php
error_reporting(E_ALL);
ini_set("display_errors", "1"); // shows all errors
ini_set("display_start_errors", "1"); // shows all errors   // "display_startup_errors"
ini_set("log_errors", "on");
ini_set("error_log", "php_errorccc.log");
function drupal_strlen($text) {
   global $multibyte;
   if ($multibyte == 1) {
       return mb_strlen($text);
   }
   else {
       // Do not count UTF-8 continuation bytes.
       return strlen(preg_replace("/[\x80-\xBF]/", '', $text));
   }
}
function ldap_password_modify($userdn, $new_password, $conn) {

   $new_password = "\"" . $new_password . "\"";
   $len = drupal_strlen($new_password);
   $new_pass = NULL;
   for ($i = 0; $i < $len; $i++) {
       $new_pass .= "{$new_password[$i]}\000";
   }
   
//    $userdn =  '16610120@bbbb.com.cn';   // ldap_mod_replace 时 这种 $userdn的参数格式不对
//    $userdn =  "bbbb\\33333333";   // ldap_mod_replace 时 这种 $userdn的参数格式也不对
   $status = ldap_mod_replace($conn, $userdn, ['unicodePwd' => $new_pass]);
   if (!$status) {
       var_dump(
           'ldap_servers',
           'Error: password_modify() failed to modify ldap password w/ base DN "!dn"',
           ['!dn' => $userdn]

       );
   }
   return $status;
}

$host= 'ldaps://192.168.2.88:636';
//$port = '636';//一般都是389
$domain = 'bbbb.com.cn';
$account = '44444444';
$user = '44444444@'.$domain;//域用户名
$password = 'nnnnnnn';//域用户密码
$conn = ldap_connect($host);//不要写成ldap_connect($host.':'.$port)的形式
if ($conn) {
   //设置参数
   ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);//声明使用版本3
   ldap_set_option($conn, LDAP_OPT_REFERRALS, 0); // Binding to ldap server
   ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

   $bd = ldap_bind($conn,$user, $password);
     //$bd = ldap_bind($conn,'CN=陈天强(11111111),OU=kkkkk,OU=llll,OU=mmmm,DC=xx,DC=yy,DC=zz', $password);   //这种$user格式也行
   if ($bd) {
       echo 'LDAP 绑定成功';//相当于登录成功

       $basedn = "ou=XXXX,ou=jjj集团,dc=YYYY,dc=com,dc=cn";
       $filter = "SamAccountName=16610120" ; //根据工号 比如 11111111
//        $justthese = array('sn', 'department', 'company', 'objectsid', 'mail', 'givenName', 'displayName', 'telephoneNumber', 'memberof', 'samaccountname', 'primarygroupid'); //选择要获取的用户属性
       $justthese = array('*'); //选择要获取的用户属性
       $sr = ldap_search($conn, $basedn, $filter, $justthese);
       echo "<pre>";
       $info = ldap_get_entries($conn, $sr);
//        print_r($info[0]);
       $status = ldap_password_modify('CN=李善(44444444),OU=JS-Site,OU=立讯集团,DC=bbbbbbbb,DC=com,DC=cn','pppppppp',$conn);
       var_dump($status);
   } else {
       echo 'LDAP 绑定失败';
   }
} else {
   echo '无法连接到AD域服务器';
}
ldap_close($conn);


普通分类: