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

这里的技术是共享的

You are here

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

我使用的是   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@luxshare.com.cn';   // ldap_mod_replace 时 这种 $userdn的参数格式不对
//    $userdn =  "LUXSHARE\\16610120";   // 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 = 'luxshare.com.cn';
$account = '16666788';
$user = '16666788@'.$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=史平忠(16666788),OU=kkkkk,OU=llll,OU=mmmm,DC=xx,DC=yy,DC=zz', $password);   //这种$user格式也行
   if ($bd) {
       echo 'LDAP 绑定成功';//相当于登录成功

       $basedn = "ou=XXXX,ou=立讯集团,dc=YYYY,dc=com,dc=cn";
       $filter = "SamAccountName=16610120" ; //根据工号 比如 16666739
//        $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=彭华(16610189),OU=JS-Site,OU=立讯集团,DC=luxshare,DC=com,DC=cn','pppppppp',$conn);
       var_dump($status);
   } else {
       echo 'LDAP 绑定失败';
   }
} else {
   echo '无法连接到AD域服务器';
}
ldap_close($conn);


普通分类: