2

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

但是,在 2008 年及以后,他们为细粒度密码策略添加了一项功能。本质上,一个特定的用户帐户可能有多个密码策略有效。

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

谢谢

4

3 回答 3

3

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

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

于 2012-08-24T14:39:06.143 回答
2

我知道这个问题已经有将近 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);
}
于 2016-07-20T22:21:09.633 回答
0

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

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

其次,您要求msDS-ResultantPSO加载属性,非常好。然后你检查以确保找到了一个用户if (results.Count >= 1),再次非常好。现在是你失败的地方......如果该属性为空(因此不包括在内)怎么办?你不能.ToString()。您需要跟进检查。它应该看起来像这样......

if (results.Count >= 1)
{
    if(results[0].Properties.Contains("msDS-ResultantPSO"))
    {
       // do stuff
    }
}
于 2020-07-07T18:56:41.820 回答