欢迎各位兄弟 发布技术文章
这里的技术是共享的
ad_info_ldap_get_entries_and_modify_dn_ok5.php
<?php
function _start_with($str, $needle)
{
    return strpos($str, $needle) === 0;
}
if (empty($_GET['gh'])) {
//    die("请在网址后加上 ?gh=八位数字 ");
}
$host= 'ldaps://192.168.2.2:636';
$port = '636';//一般都是389
$domain = 'aaa.com.cn';
$account = '11111111';
$user = '11111111@' . $domain; //域用户名
$password = 'Mypassword'; //域用户密码
$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
    $bd = ldap_bind($conn, $user, $password);
    $basedn = "OU=11T项目,OU=SJ-Site,OU=XXX集团,DC=aaaa,DC=com,DC=cn";
    // $filter = "(objectClass=*)";//选择器
    // $filter = "(&(sAMAccountName=工号))";//选择器
    $filter = "SamAccountName=*" ; //根据工号 比如 1111111
    //$filter="(|(sn=张三*)(givenname=李四*))";
    
    //    $justthese = array('*'); //选择要获取的用户属性
    //$justthese = array('SamAccountName','displayName'); //选择要获取的用户属性
    //AD 的常用属性  全用小写吧
    $justthese = array(
 'sn', // 姓
 'givename', //名
 'samaccountname',//工号
 'department', //部门
 'manager', //领导
 'company',//公司
'objectsid',
'mail',//邮箱 电子邮件
'facsimileTelephoneNumber',    //传真
'displayname', //显示名称 比如  Huazheng Wang(王花真)
 'dn', //  
 'telephoneNumber', //电话
 'directreports', // 下属
 'memberof',  //权限组,,,隶属于
'samaccountname',
'primarygroupid', //
 'dn',//完全合格名称
 'cn', // 通用名称
 'description', // 描述信息
 'accountexpires', // 到期时间
 'lastlogon', // 最后登录时间
 'logoncount', // 总共登录次数
 'useraccountcontrol', //    用户帐号控制,,,(普通启用,,,禁用,,,密码永不过期启用)
 'lockouttime', //  锁定时间
 'badpwdcount', //  用户尝试错误密码的次数  
 'badPasswordTime', //  用户最后一次尝试错误密码的时间  
 'whenchanged', //    AD对像最后修改时间            
 'primarygroupid', //  所属的主要组的id 
 'whencreated', //      AD对像创建时间        
 'userprincipalname', //        用户主体名称,,
 //也称为用户登录名或电子邮件地址样式的标识符。UPN通常采用username@domainname的形式,其中“username”是用户的唯一标识部分,而“domainname”是域名,它可以是内部Active Directory域名或与之关联的公共Internet域名。例如,john.doe@example.com。
 'distinguishedname', // 等同于 'dn'  尊贵的,正式的,杰出的 全部的名称 完全合格名称
 'pwdlastset',         //密码最后修改时间
 'userworkstations',     // 用户工作站       
 'city',    //    用户所在的城市。
 'streetaddress', //    用户的街道地址
 'postalcode', //    邮政编码
 'physicaldeliveryofficename', //  正式的公司名称
 'userPassword', //  用户密码,是加密的
); //选择要获取的用户属性
    //$sr=ldap_search($conn, $basedn,$filter );
    $sr = ldap_search($conn, $basedn, $filter, $justthese);
    echo "<pre>";
    $info = ldap_get_entries($conn, $sr);
//    print_r($info);
    unset($info['count']);
        print_r($info);
    $new_info = array();
    foreach($info as $key=>$value)
    {
//        unset($info[$key][0]);
//        unset($info[$key]['count']);
        $new_info[$key]['samaccountname'] = $value['samaccountname'][0];
        $new_info[$key]['dn'] = $value['dn'];
        $displayname = strrchr($value['displayname'][0],"(");
        $displayname = substr($displayname,strpos($displayname,"(")+1,strpos($displayname,")")-1);
        $new_info[$key]['displayname'] = $displayname;
    }
    foreach($new_info as $key=>$value)
    {
        if(!_start_with($value['dn'],'CN=T')){
            unset($new_info[$key]);
        }
        $currentDn = $value['dn'];
        $newParent = $suffix_dn = "OU=11T项目,OU=SJ-Site,OU=XXX集团,DC=aaaa,DC=com,DC=cn";
        $newDn = "CN=".$value['displayname']."((".$value['samaccountname']."))";
//        $newRdn    = "CN=".$value['displayname']."(".$value['samaccountname'].")";
        // 检查新 DN 是否已存在
//        $checkDn = ldap_search($conn, $baseDn, "(distinguishedName=$newDn)");
//        if (!$checkDn) {
//            die("检查新 DN 失败: " . ldap_error($conn));
//        }
//        if (ldap_count_entries($ldapConn, $checkDn) > 0) {
//            die("新 DN $newDn 已存在,请选择其他 DN。");
//        }
//var_dump($currentDn);
//var_dump($newDn);
        $modifyDn = ldap_rename($conn, $currentDn, $newDn, $newParent, true);
        if (!$modifyDn) {
                var_dump(ldap_error($conn));
                var_dump(ldap_errno($conn));
                ldap_get_option($conn, LDAP_OPT_ERROR_STRING, $extendedError);
                var_dump($extendedError);
            die("失败!");
        }
        break;
    }
    echo "用户 DN 已成功修改为 $newDn ";
//    var_dump($new_info);
    echo "</pre>";
    if ($bd) {
        echo 'LDAP 绑定成功'; //相当于登录成功
    } else {
        echo 'LDAP 绑定失败';
    }
} else {
    echo '无法连接到AD域服务器';
}
ldap_close($conn);