2012-08-23 66 views
2

我没有问题在Windows 2008以前的域环境中获取密码过期日期。我能够获得默认域策略并获得密码到期日期。Active Directory帐户密码过期日期与细粒度密码策略

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

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

感谢

回答

3

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

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

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); 
} 
相关问题