.net 从ADUser获取UserPrincipal

yeotifhr  于 2023-03-24  发布在  .NET
关注(0)|答案(2)|浏览(95)

我有一个ADUsers的列表,但foreach ADUSER我想得到它的属性“LastPasswordSet”,这是唯一可访问的(我不知道是否有任何其他方式以及)通过UserPrincipal。
如果我使用这个代码,

PrincipalContext l_objContext = new PrincipalContext(ContextType.Domain, l_strDomain, l_strUserOU);

 foreach (ADUser ADuser in Users)
            {
                UserPrincipal usr = UserPrincipal.FindByIdentity(l_objContext, ADuser.CommonName.ToString());

                if (usr.LastPasswordSet.HasValue)
                {
                    EmailString(usr.LastPasswordSet.ToString());
                }
            }

现在我不想提供任何东西给UserPrincipal其他然后ADUSER的任何属性,上面的代码也不起作用,问题是它发送几封电子邮件,然后在某个地方遇到它,并出现错误和服务停止,这可能是因为一些无效的日期(我不想修复它,只是说明,以便您了解我在做什么)

5f0d552i

5f0d552i1#

您可以创建自己的PrincipalContext,然后使用UserPrincipal.FindByIdentity获取主体。从这里开始,我想您已经知道了,您可以调用LastPasswordSet属性。

public static DateTime? GetLastPasswordSet(string domain, string userName)
{
    using (var context = new PrincipalContext(ContextType.Domain, domain))
    {
        var userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userName);
        return userPrincipal.LastPasswordSet;
    }
}

注意:您需要添加对System.DirectoryServices.AccountManagement的引用
[编辑:回应评论中的进一步问题]
要测试密码是否是在一个多月前最后设置的-类似于以下内容:

if (lastPasswordSet < DateTime.Now.AddMonths(-1))
{
   // Password last set over a month ago.
}

有一件事要记住的是,一个月是一个模糊的时间长度-它的长度取决于你是在哪个月(和年)。根据你想做的事情,它可能是更适合有一个固定的时间段,如28天。

xvw2m8pv

xvw2m8pv2#

标记为答案的帖子在我的情况下不起作用,因为必须有一些安全设置,不允许用户访问此属性,因为它没有被返回,并且属性PasswordNeverExpires始终为true。如果管理员用户对自己执行此操作,他们将获得正确的值。

相关问题