欢迎各位兄弟 发布技术文章
这里的技术是共享的
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);