在.Net 3.5中测试"用户必须更改密码"字段

Grh*_*rhm 3 .net c# active-directory .net-3.5

我正在尝试使用.Net 3.5在C#中执行一些基本的AD用户管理任务

我有一个包含用户详细信息的System.DirectoryServices.AccountManagement.UserPrincipal对象.

我可以打电话user.ExpirePasswordNow(),用户将在下次登录时被迫更改密码(并且"Active Directory用户和计算机"GUI具有"用户必须在下次登录时更改密码"复选框.

但是,我想测试这个属性的状态并对它采取行动 - 我不想总是通过ExpirePasswordNow()函数将它设置为true .我怎样才能做到这一点?

我发现了一些示例,建议我访问底层的DirectoryEntry及其pwdLastSet属性 - 但这看起来像一个无法穿透的System .__ ComObject类型 - 它可能是一个IADsLargeInteger,但由于其"保护级别",我无法转换为该类型.

我不知所措 - 有人可以帮忙吗?

And*_*ker 6

我记得这是因为必须找出用户上次设置密码的时间,但我从未使用过它.希望它有所帮助......我从未尝试过UserAccountControl属性,但它看起来并不太疯狂.

Pwd-Last-Set属性

如果此值设置为0并且User-Account-Control属性不包含UF_DONT_EXPIRE_PASSWD标志,则用户必须在下次登录时设置密码.

查看User-Account-Control,其中包含一个如何仅读取此标志的示例(作为查询的一部分).如果可能的话,将属性添加到'待返回'可能更好.


我认为这应该适用于3.5.他们让这个更简单.我无法获取DirectorySearcher对象来返回UserAccountControl标志,只有这一点.也许这就是权限,不知道......

Imports System.DirectoryServices.AccountManagement

Dim pctx = New PrincipalContext(AccountManagement.ContextType.Domain)
Dim p = UserPrincipal.FindByIdentity(pctx, "andrew")
If p.LastPasswordSet.HasValue = False Then
    If p.PasswordNeverExpires = False Then
        Console.WriteLine("You should have to enter a password next time!")
    End If
End If
Run Code Online (Sandbox Code Playgroud)