如何用Springboot LdapTemplate定期查询AD中已删除用户
如何通过Spring Boot LdapTemplate查询Active Directory中已删除的用户
核心前提说明
Active Directory中被删除的用户默认会被移动到Deleted Objects容器(仅在开启可恢复删除功能时有效,默认开启),要查询这些对象,需满足两个条件:
- 用于绑定LDAP的账号拥有读取该容器的权限(普通域用户默认无此权限,建议使用域管理员或授权后的账号)
- 查询时需指定Deleted Objects容器的DN作为根节点,同时使用特定的过滤条件
具体实现步骤
确定Deleted Objects容器的DN
格式通常为:CN=Deleted Objects,DC=your-domain,DC=com,替换成你的实际域信息。构造查询条件
需要过滤出已删除的用户对象,核心过滤条件包括:isDeleted=true:标记该对象已被删除objectClass=person:确保是用户对象whenChanged:可选,用于增量同步的时间范围筛选,匹配删除操作的时间
LdapTemplate查询代码示例
// 定义Deleted Objects容器的DN String deletedObjectsDn = "CN=Deleted Objects,DC=your-domain,DC=com"; // 增量同步的时间阈值 Date syncDate = ...; // 构造查询条件:已删除的用户,且删除时间在同步阈值之后 LdapQuery query = query() .base(deletedObjectsDn) .where("objectclass").is("person") .and("isDeleted").is("true") .and("whenChanged").gte(syncDate); // 执行查询,映射已删除用户的信息(可获取原CN、lastKnownParent等属性) List<UserModel> deletedUsers = ldapTemplate.search(query, new AttributesMapper<UserModel>() { @Override public UserModel mapFromAttributes(Attributes attributes) throws NamingException { UserModel userModel = new UserModel(); // 获取原用户CN userModel.setCn(attributes.get("cn") != null ? attributes.get("cn").get().toString() : null); // 获取用户删除前所在的OU(可选) userModel.setLastKnownParent(attributes.get("lastKnownParent") != null ? attributes.get("lastKnownParent").get().toString() : null); return userModel; } });
注意事项
- 如果AD关闭了可恢复删除功能,被删除的用户会直接被彻底清除,无法通过此方式查询。
- 部分AD环境中,
whenChanged属性会记录删除操作的时间,可用于增量同步的时间过滤;若需更精准的删除时间,可尝试读取whenDeleted属性(部分AD版本支持)。 - 确保LdapTemplate的配置账号拥有足够权限,否则会抛出权限不足的异常。
内容的提问来源于stack exchange,提问作者user5510222
相关产品推荐
相关产品推荐

