ASP.NET C#Active Directory - 查看用户密码到期之前的时间

时间:2009-09-01 15:06:58

标签: asp.net c#-3.0 active-directory

我有一个有趣的问题,我正在编写一个密码管理网页/服务,我正试图找到一种方法来确定用户的密码何时到期,这样我就可以用它手动重置其他密码并发出一个电子邮件等。

我遇到的问题是,当我试图遍历我的用户时,我发现他们中的大部分没有pwdlastset属性,所以我无法确定它什么时候会过期。

所以我想我正在寻找一个好的方法来检查用户的密码何时到期,除了使用pwdlastset属性并计算剩余时间。

非常感谢。

3 个答案:

答案 0 :(得分:8)

实际上它比你最初想象的要复杂得多......

  • 为了知道密码有效期多长,您需要阅读“域名政策”并找出相应的方式

然后:

  • 如果用户在其“userAccountControl”中设置了“UF_DONT_EXPIRE_PASSWD”标志,则其密码将永不过期
  • 如果“pwdLastSet”值(“ADSLargeInteger”或Int64值,首先读起来比较棘手)为0,则用户下次登录时必须更改密码
  • 如果“pwdLastSet”值为-1,则从未设置密码
  • 仅当上述情况均不属实时,则“pwdLastSet”值包含上次设置密码的日期,您可以从域策略中添加“MaxPasswordAge”,这将为您提供日期用户的密码将过期

唷!你觉得这会很棘手吗? :-)

马克

PS:如果你认真对待基于.NET的AD编程,你应该有这本书:

DevGuide

The .NET Developer's Guide to Directory Services Programming

本书包含确定用户密码到期日期,确定用户帐户锁定状态等所有好处 - 强烈推荐! Joe和Ryan做了出色的工作,将所有这些信息汇总并解释,以便即使像我这样的普通Joe程序员也能理解它: - )

答案 1 :(得分:0)

据我所知,如果pwdlastset为零或缺失,则要求用户在下次登录时更改其密码,或者使用非过期密码设置其帐户。这可能是你所看到的原因吗?

答案 2 :(得分:0)

这是另一种方法:

public static DateTime GetPasswordExpirationDate(UserPrincipal user)
{
    DirectoryEntry deUser = (DirectoryEntry)user.GetUnderlyingObject();
    ActiveDs.IADsUser nativeDeUser = (ActiveDs.IADsUser)deUser.NativeObject;
    return nativeDeUser.PasswordExpirationDate;
}

您需要添加对通常位于C:\ Windows \ System32 \ activeds.tlb的ActiveDS COM库的引用。