3

Active Directoryユーザーがパスワードを更新できるようにするために、次のコードをWebアプリケーションの一部として使用しています(Active DirectoryとGmailの両方)。私はSystem.DirectoryServices.AccountManagementでC#を使用しています。C#Active Directoryを呼び出す "ChangePassword"がドメインに連絡できません

このコードは、昨日から、昨日

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]:

のにSAMAccountName

ためのLDAP接続され、検索ディレクトリ[8時37分01秒AM]:ユーザー・エントリを取得します。

[8時37分01秒AM]:パスワードに設定

[8時37分01秒AM]:ジェイソンのために、Windowsのパスワードをリセットするために失敗しました。


呼び出しの対象によって例外がスローされました。


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

「強制」オプションがまだうまく動作しますが、管理者以外のユーザーによって呼び出すことができる「のChangePassword」方法がありません。

答えて

0

今月初め、Microsoft released a security patchがパスワード変更の脆弱性を解決しました。特に、パスワードの変更時にKerberos認証が失敗した後のNTLM認証へのフォールバックをブロックしました。

アップデートhereの詳細については、お読みください。

+0

これは非常に役に立ちます。ありがとうございます。 –

1

変更userPrincipal.ChangePassword( "Old pass"、 "New Pass"); 〜userPrincipal.SetPassword(model.NewPassword);

+0

管理者権限のないユーザーコンテキストは、SetPasswordを呼び出すことができません。 –

0

マイクロソフトでは、この資料を更新しました:https://support.microsoft.com/en-us/kb/3177108。ここでは、オリジナルの「修正」によって作成された問題と、Kerberosおよびセルフサービスのパスワードリセットを使用するためのヒントを示しました。

2016年10月11日、マイクロソフトではhttps://technet.microsoft.com/en-us/library/security/ms16-101.aspxに関連する修正プログラムをリリースして、元の更新プログラム(ローカルアカウントのパスワードを変更できなくなったという事実を含めてhttps://support.microsoft.com/en-us/kb/3177108で読むことができます)の問題を解決しました。

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(); 
} 
関連する問題