3

Active Directory ユーザーがパスワードを更新できるようにするための Web アプリケーションの一部として、次のコードがあります (Active Directory と gmail を同時に)。System.DirectoryServices.AccountManagement で C# を使用しています。

このコードは昨日まで機能していました

try
{
    State.log.WriteLine("Connecting LDAP.");
    string ldapPath = "LDAP://192.168.76.3";
    DirectoryEntry directionEntry = new DirectoryEntry(ldapPath, domainName + "\\" + userName, currentPassword);
    if (directionEntry != null)
    {
        DirectorySearcher search = new DirectorySearcher(directionEntry);
        State.log.WriteLine("LDAP Connected, searching directory for SAMAccountName");
        search.Filter = "(SAMAccountName=" + userName + ")";
        SearchResult result = search.FindOne();
        if (result != null)
        {
            State.log.WriteLine("Getting User Entry.");
            DirectoryEntry userEntry = result.GetDirectoryEntry();
            if (userEntry != null)
            {
                State.log.WriteLine("Setting Password");
                if (force)
                {
                    userEntry.Invoke("SetPassword", new[] { newPassword });
                }
                else
                {
                    userEntry.Invoke("ChangePassword", new object[] { currentPassword, newPassword });
                }
                userEntry.CommitChanges();
                State.log.WriteLine("Changes Committed to ActiveDirectory.");
            }
            else
            {
                State.log.WriteLine("Could not get user Entry...");
            }
        }
        else
        {
            State.log.WriteLine("Search returned no results.");
        }
    }
    else
    {
        State.log.WriteLine("Could not connect to LDAP with given username and passwd");
    }
}

昨日から、このコードは次の行になります。

userEntry.Invoke("ChangePassword", new object[] { currentPassword, newPassword });

そして、次の例外をスローします。

[8:37:00 AM] : パスワード要件が満たされました。

[8:37:00 AM] : LDAP を接続しています。

[8:37:00 AM] : LDAP 接続、SAMAccountName のディレクトリを検索中

[8:37:01 AM] : ユーザー エントリを取得しています。

[8:37:01 AM] : パスワードの設定

[8:37:01 AM] : jason の Windows パスワードのリセットに失敗しました。


呼び出しのターゲットによって例外がスローされました。


システムは、認証要求を処理するためにドメイン コントローラに接続できません。後でもう一度やり直してください。(HRESULT からの例外: 0x800704F1)

「SetPassword」を使用した「強制」オプションは問題なく機能しますが、管理者以外のユーザーが呼び出すことができる「ChangePassword」メソッドは機能しません。

4

4 に答える 4

1

回避策を見つけたので、投稿するのを忘れていました。私がしたことは、上記のコードを使用してユーザーを認証し、「ForceChangePassword」メソッドを呼び出すだけでした。

public static void ForceChangeADPassword(String username, String newPassword)
{
    String DN = "";
    try
    {
        DN = GetObjectDistinguishedName(objectClass.user, returnType.distinguishedName, username, DOMAIN_CONTROLLER_IP);
    }
    catch(Exception e)
    {
        throw new PasswordException(String.Format("Could not find AD User {0}", username), e);
    }

    if(DN.Equals(""))
        throw new PasswordException(String.Format("Could not find AD User {0}", username));

    DirectoryEntry userEntry = new DirectoryEntry(DN.Replace("LDAP://", LdapRootPath), "accounts", AcctPwd);
    userEntry.Invoke("SetPassword", new object[] { newPassword });
    userEntry.Properties["LockOutTime"].Value = 0;

    userEntry.CommitChanges();
    userEntry.Close();
}
于 2016-10-27T13:51:52.110 に答える
1

Change userPrincipal.ChangePassword("古いパス", "新しいパス"); にuserPrincipal.SetPassword(model.NewPassword);

于 2016-08-24T20:28:47.683 に答える
0

Microsoft はこの記事を更新しました: https://support.microsoft.com/en-us/kb/3177108 . ここでは、元の「修正」によって作成された問題と、Kerberos およびセルフサービス パスワード リセットを使用するためのヒントを提供してくれました。

2016 年 10 月 11 日の時点で、Microsoft はhttps://technet.microsoft.com/en-us/library/security/ms16-101.aspxに関連付けられたパッチを再リリースし、元の更新によって引き起こされた問題を解決しました (これを読むことができます)。https://support.microsoft.com/en-us/kb/3177108 (ローカル アカウントのパスワードを変更できなくなったという事実を含む)。

于 2016-10-12T06:14:42.350 に答える
0

今月初め、Microsoftはセキュリティ パッチ をリリースし、パスワードの変更に関するいくつかの脆弱性を解決しました。具体的には、この更新プログラムは、パスワードの変更時に Kerberos 認証が失敗した後、NTLM 認証へのフォールバックをブロックしました。

アップデートの詳細については、こちらをご覧ください。

于 2016-08-24T14:18:54.043 に答える