在Laravel中使用Adldap如何获取用户密码或密码哈希?
关于通过Adldap获取Active Directory用户密码/哈希的问题
首先明确:你没办法通过常规LDAP查询获取Active Directory用户的明文密码,甚至密码哈希也很难拿到,这是AD的安全设计决定的。
为什么你的代码拿不到密码?
AD里根本不存在password这个属性,你在select里写的这个字段完全无效。AD不会存储用户的明文密码,密码哈希(比如NTLM哈希)虽有存储,但放在unicodePwd属性中,这个属性有极其严格的访问限制:
- 必须通过LDAPS(SSL加密,端口636)连接AD,普通LDAP连接根本看不到这个属性
- 用来绑定AD的服务账号必须拥有域级的Replicating Directory Changes和Replicating Directory Changes All权限,这两个权限默认只有域管理员能获取
- 就算拿到
unicodePwd的值,它也是用域控制器密钥加密后的密文,不是直接可用的哈希值,只有域控制器本身能解密
用户同步到本地数据库的可行方案
如果你的需求是让本地数据库用户能正常登录,别想着同步AD的密码/哈希,换这些方案更靠谱:
- 实现单点登录:用SAML、OAuth2或者Kerberos/NTLM认证,让用户直接用AD账号登录本地系统,不用在本地存储密码
- 让用户首次登录本地系统时重置密码,将密码存在本地数据库
- 若非要同步哈希,只能通过域控制器系统备份、或专用域内工具提取NTLM哈希,但这属于高风险操作,违反域安全最佳实践,且需要域管理员级权限
修正你的查询代码
去掉无效的password字段,正确的查询代码如下:
$users = Adldap::search()->users() ->select(['cn', 'samaccountname', 'objectguid', 'mail', 'useraccountcontrol']) ->limit(5) ->get(); dd($users);
内容的提问来源于stack exchange,提问作者KordDEM
相关产品推荐
相关产品推荐

