锵锵枪 wrote:

PHP自助重置Windows AD域账号密码



公司通过 Windows活动目录 为内部各系统提供 账号、密码认证服务,系统版本为windows server 2012,但是经常有密码遗忘、密码错误要求解锁的需求,于是打算弄一个自助服务的系统,对于这种琐碎的事情能自个儿处理。

这里记载搭建过程中遇到的几个坑和需要注意的点,有同样需求的朋友可以参考:

基础:

一、
安装Nginx、PHP、PHP-FPM,需要启用php_ldap扩展,直接yum安装即可。

注:后面用到的开源库,需要php7以上支持,这里可以直接安装php7

二、
AD域修改密码必须通过SSL/TLS链接,SSL基本已经废弃。通过TLS连接AD,需要在AD上安装证书服务,然后导出域服务器的CA证书,并导入到 服务器的 受信任证书办法机构里面。

否则php发起TLS连接的时候会因为证书不受信任而拒绝连接。

安装配置:

一、安装Adldap2:

使用了,Github上的Adldap2(https://github.com/Adldap2/Adldap2)这个库,里面封装好了很多现成的类函数,可以直接调用,避免重复工作。

可以通过composer直接安装:composer require adldap2/adldap2

二、windows时间戳到linux时间戳的转换:

通过AD域读取到的时间需要转换成unix时间戳,转换关系: unixtime=windowstime/10000000 - 11644473600

也可以直接调用Adldap 里面的 Utilities::convertWindowsTimeToUnixTime($time)

三、初始化:

require __DIR__ . \'/vendor/autoload.php\';
$config = [
// Mandatory Configuration Options
\'hosts\' => [\'hiad.21du.cn\',], //这里是AD服务器的域名
\'base_dn\' => \'dc=hiad,dc=21du,dc=cn\', //AD的BASE DN
\'username\' => \'administator\', //管理员账户密码,非必须。用户密码遗忘重置,需要通过管理员账户重置
\'password\' => \'123456@654321!\',

// Optional Configuration Options
\'schema\' => Adldap\\Schemas\\ActiveDirectory::class,
//\'account_prefix\' => \'ACME-\',
\'account_suffix\' => \'@hiad.21du.cn\',
//\'port\' => 389,
\'follow_referrals\' => false,
\'use_ssl\' => false,
\'use_tls\' => true, //使用TLS连接,false的时候只能完成查询
\'version\' => 3,
\'timeout\' => 5,

// Custom LDAP Options
\'custom_options\' => [
// See: http://php.net/ldap_set_option
LDAP_OPT_X_TLS_REQUIRE_CERT => LDAP_OPT_X_TLS_HARD
]
];

$ad = new Adldap\\Adldap();
$ad->addProvider($config);
$pd = $ad->connect();

//实例一个用户,后续可以对此用户进行相关查询、修改操作
$user = $pd->search()->where(\'samaccountname\', \'=\', \"zhangsan\")->first();


跟用户相关的函数
/src/Models/User.php

$user->setClearLockoutTime();//解锁锁定
$user->setPassword($_POST[\'pwd1\']); //重置密码,需以管理员账户连接
$user->changePassword($oldPassword, $newPassword);//修改密码
$ad->auth()->attempt(\"zhangsan\", \"password12!\");//对用户进行认证

四、鉴权用户:

可以通过用户的旧密码进行鉴权然后授权相关操作。

但是针对密码遗忘的,可以读取AD登记的用户邮箱、手机号,然后发送短信、邮件验证码进行鉴权。

2019-09-30 11:02:37  0 回复

====