具有细粒度密码策略的Active Directory帐户密码到期日期

时间:2012-08-23 21:18:50

标签: c# .net active-directory

我在Windows 2008之前的域名环境中获取密码到期日期没有问题。我能够获得默认域策略并获取密码到期日期。

然而,在2008年及以后,他们为Fine-Grain密码策略添加了一项功能。基本上多个密码策略可能对特定用户帐户有效。

是否有人有任何资源或示例代码考虑到这些新的FGPP以及如何将它们合并到我现有的脚本中?

由于

3 个答案:

答案 0 :(得分:3)

最简单的方法是查看有问题的特定用户的msDS-ResultantPSO构造属性,并获取适用于该用户的密码设置对象的DN。从那里,您可以查看PSO上的到期设置,并将其与用户的pwdLastSet值相结合。

如果用户的msDS-ResultantPSO属性为null,那么您应该回退到域密码策略。

答案 1 :(得分:1)

我知道这个问题差不多已有4年了,但我想添加一些代码来解决类似的问题。此外,如果您无法从PSO中读取,则需要确保运行代码的用户对相关PSO具有读取权限(这是导致我最麻烦的原因)。

var ad = new PrincipalContext(ContextType.Domain, _domain, _ldapPathOu);

UserPrincipal user = UserPrincipal.FindByIdentity(ad, username);
DirectoryEntry entry = user.GetUnderlyingObject() as DirectoryEntry;
DirectorySearcher mySearcher = new DirectorySearcher(entry);
SearchResultCollection results;
mySearcher.PropertiesToLoad.Add("msDS-ResultantPSO");

results = mySearcher.FindAll();

if (results.Count >= 1)
{
    string pso = results[0].Properties["msDS-ResultantPSO"][0].ToString();

    //do something with the pso..
    DirectoryEntry d = new DirectoryEntry(@"LDAP://corp.example.com/"+ pso);

    var searchForPassPolicy = new DirectorySearcher(d);
    searchForPassPolicy.Filter = @"(objectClass=msDS-PasswordSettings)";
    searchForPassPolicy.SearchScope = System.DirectoryServices.SearchScope.Subtree;

    searchForPassPolicy.PropertiesToLoad.AddRange(new string[] {"msDS-MaximumPasswordAge"});
    var x = searchForPassPolicy.FindAll();

    var maxAge = (Int64)x[0].Properties["msDS-MaximumPasswordAge"][0];
    var maxPwdAgeInDays = ConvertTimeToDays(maxAge);
}

答案 2 :(得分:0)

由于我没有足够的声誉来评论@foldinglettuce的答案,所以我将在我自己的答案中提供它。

首先,您不需要像对DirectoryEntry那样使用“ @”来转义正斜杠。它不是必需的,应将其删除。

第二,您要求加载msDS-ResultantPSO属性,很好。然后,检查以确保找到具有if (results.Count >= 1)的用户,这同样很好。现在是您失败的地方...如果该属性为null(因此不包括在内)怎么办?您不能.ToString()。您需要进行检查。它应该看起来像这样……

if (results.Count >= 1)
{
    if(results[0].Properties.Contains("msDS-ResultantPSO"))
    {
       // do stuff
    }
}