1

問題: AD サーバーを 2003 年から 2008 年にアップグレードしましたが、開発者が「badPwdCount」プロパティ値を INT に直接キャストし、NULL 値のために爆発するような方法でコーディングした「悪いコード」が原因でした。変換 - NULL 参照例外 - NULL は INT に変換できません。

より大きな問題: この変更に依存する個別のアプリが 100 を超えているため、現時点では展開を行うことができません。

背景: この「badPwdCount」プロパティの仕組みは、ユーザーがドメインにログオンするとゼロに設定され、それ以外の場合は NULL に設定されます。問題は、これらのユーザーが外部ユーザーであり、API を介して認証し、API を使用してログインできないため、これらのユーザーが対話的にログオンすることはないということです..

質問: この値がレジストリにあるのか、それともどこかにあるのか、アクセスしてゼロに設定できる場所を知っている人はいますか? スクリプトを介してユーザーごとにログインを開始することも考えていましたが、他のアイデアも集めたかった...

badPwdCount の MSDN ページ: http://msdn.microsoft.com/en-us/library/windows/desktop/ms675244(v=vs.85).aspx

4

1 に答える 1

3

通常、これは簡単です。Active Directory 内のすべてのユーザーを更新し、null の場合は値を 0 に設定するだけです。スクリプトやコード、一括更新ツールなど、さまざまな方法でこれを行うことができます。

この場合、badPwdCount はレプリケートされない (つまり、ドメイン コントローラーごとに異なる) 特別なプロパティであり、私が知る限り、手動またはスクリプトで更新する方法はありません。あなたのためのソリューション。

各ドメイン コントローラーに対して Active Directory 内のすべてのユーザーに対して単一の失敗したログインを簡単にトリガーできるはずです。これにより、値がインクリメントされます。

投稿に C# のタグを付けたので、このトリックを実行する C# コードを次に示します。

using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;

...

using (Domain domain = Domain.GetComputerDomain())
{
    foreach (DomainController domainController in domain.DomainControllers)
    {
        using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domainController.Name))
        using (UserPrincipal userPrincipal = new UserPrincipal(context))
        using (PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal))
        using (PrincipalSearchResult<Principal> results = searcher.FindAll())
        {
            foreach (UserPrincipal user in results.OfType<UserPrincipal>())
            {
                context.ValidateCredentials(user.SamAccountName, "THEREISNOWAYTHISISTHECORRECTPASSWORD");
            }
        }
    }
}

PS。これがあなたのADを台無しにしても、私はそれに対して責任を負いません!

于 2013-11-12T17:47:01.827 に答える