使用细粒度密码策略的Active Directory帐户密码过期日期



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

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

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

感谢

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

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

我知道这个问题已经有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);
}

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

首先,您不需要像对DirectoryEntry使用"@&";。它不是必需的,应该删除。

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

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

经过在互联网上仔细思考,寻找答案,但没有找到太多,我创建了这个在PowerShell中为我们工作的命令(将OUPath修改为您的AD OU):

$OUpath = 'ou=Users,dc=company,dc=local'
$ExportPath = 'c:temppwexpiry.csv'
Get-ADUser -SearchBase $OUpath -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" | 
Select-Object -Property "Displayname",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}} | Export-Csv -NoType $ExportPath

这将为您提供一个很好的CSV文件,其中包含特定OU的细粒度密码到期日期。

最新更新