2

Windows 2008 より前のドメイン環境でパスワードの有効期限を取得するのに問題はありません。デフォルトのドメイン ポリシーとパスワードの有効期限を取得できました。

ただし、2008 年以降、Fine-Grain パスワード ポリシーの機能が追加されました。基本的に、特定のユーザー アカウントに対して複数のパスワード ポリシーが有効な場合があります。

これらの新しい FGPP を考慮したリソースやサンプル コード、およびそれらを既存のスクリプトに組み込む方法を知っている人はいますか?

ありがとう

4

3 に答える 3

3

最も簡単な方法はmsDS-ResultantPSO、問題の特定のユーザーについて構築された属性を調べ、そのユーザーに適用されるパスワード設定オブジェクトの DN を取得することです。そこから、PSO の有効期限設定を確認し、それをpwdLastSetユーザーの値と組み合わせることができます。

ユーザーの属性が null の場合は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 に答える