在 Active Directory 之上构建自定义身份验证服务(使用 LDAP),我们现在需要查看帐户的密码是否已过期(最好还要查看密码过期/过期的时间)。我们需要在查询帐户时看到这一点(而不是在bind()
用户请求的上下文中)。
Active Directory 中为此提供了几个标志。我们首先尝试的是User-Account-Control属性,ADS_UF_PASSWORD_EXPIRED
如果密码过期,该属性应设置:
用户密码已过期。该标志由系统使用来自 Pwd-Last-Set 属性和域策略的数据创建。
我们无法让它工作,并找到了 SimpleADSI的解释:
注意:该位不按预期工作!
通常,该用户帐户控制位应该指示用户的密码已过期。但是,密码实际到期时系统不会设置,也不能通过设置该位强制用户在下次登录时更改密码。
相反,它们引用构造的属性 msDS-User-Account-Control-Computed,该属性还包含用于检查密码到期的位:UF_PASSWORD_EXPIRED
。还有另一个构造属性msDS-UserPasswordExpiryTimeComputed,用于获取密码何时过期。完美,有一个警告:
构造的属性不能作为 LDAP 搜索请求中的值数据返回。除非搜索范围设置为“base”,这意味着 LDAP 客户端只能访问一个对象。
这意味着我们必须为每个帐户执行一个额外的查询来获取构造的属性。不理想,但它有效。
接下来,林中的更多 Active Directory 域也希望使用新的自定义身份验证服务,因此我们开始查询 Active Directory 全局目录,而不是查询本地域控制器(这意味着我们可以查询同一林中任何域中的对象)。
对于问题(最后) :全局目录不会同步本地域控制器的所有属性。“幸运的是”不工作的 User-Account-Control 属性是同步的(哦,讽刺的是),但我们使用的构造属性不是。这意味着我们又回到了原点,无法获取帐户密码何时或什至已过期。
所以,两个主要问题是:
- 是否有任何方法可以将构造的属性(或计算它们的值)同步到 Active Directory 全局目录?
- 有没有更好的方法,也许是为了避免我们为获取构造属性所做的(做过)单对象查询(我想我想问我们是否做错了......)?
提前致谢!