C# 测试“;“用户必须更改密码”;.NET3.5中的字段

C# 测试“;“用户必须更改密码”;.NET3.5中的字段,c#,.net,.net-3.5,active-directory,C#,.net,.net 3.5,Active Directory,我正在尝试使用.NET3.5在C#中执行一些基本的广告用户管理任务 我有一个System.DirectoryServices.AccountManagement.UserPrincipal对象,其中包含用户详细信息 我可以调用user.ExpirePasswordNow(),用户将被迫在下次登录时更改密码(并且“Active Directory用户和计算机”GUI选中了“用户下次登录时必须更改密码”框) 但是,我想测试此属性的状态并对其执行操作-我不想总是通过ExpirePasswordNow(

我正在尝试使用.NET3.5在C#中执行一些基本的广告用户管理任务

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

我可以调用
user.ExpirePasswordNow()
,用户将被迫在下次登录时更改密码(并且“Active Directory用户和计算机”GUI选中了“用户下次登录时必须更改密码”框)

但是,我想测试此属性的状态并对其执行操作-我不想总是通过
ExpirePasswordNow()
函数将其设置为true。我如何才能做到这一点

我发现一些示例表明我可以访问底层DirectoryEntry及其
pwdLastSet
属性,但这似乎是一个不可穿透的系统。u ComObject类型-它可能是一个IADsLargeInteger,但由于其“保护级别”,我无法强制转换为该类型


我不知所措-有人能帮我吗?

我记得这是因为我必须知道用户最后一次设置密码的时间,但我从未使用过。希望这有帮助……我也从未尝试过UserAccountControl属性,但它看起来不太疯狂

如果此值设置为0,并且属性不包含UF\u DONT\u EXPIRE\u PASSWD标志,则用户必须在下次登录时设置密码

查看用户帐户控制,有人提供了一个如何仅读取此标志的示例(作为查询的一部分)。如果可能,最好只将属性添加到“待返回”中


我认为这应该在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
这可能有助于:

我很难找到一个免费的公用事业 这将向员工发送电子邮件 在他们的windows密码被删除之前 准备到期了,所以我写了一个C# 执行此操作的控制台应用程序


根据你的问题,在你打电话给ExpirePasswordNow之后,你不能打电话给ChangePassword吗?@shahkalpesh:也许我没有解释清楚。我不想打电话给ExpirePasswordNow()。我要做的就是查询用户是否将在下次登录时被迫更改。谢谢。这似乎完成了工作。我花了很长时间试图通过pwdlast集实现这一点,并使用UserAccountControl(它似乎无法准确反映它包含的所有标志!!)很高兴它成功了:)这是一次冒险,因为我不能搞乱我自己的账户。此外,在使用DirectorySearcher时,_comObject内容(至少是基本类型)会为您转换为.net类型,如pwdLastSet。