2012-10-01 30 views
7

次のコードは3か月間問題なく動作していました。 今日以降、次のエラーが発生しています。 "呼び出しのターゲットによって例外がスローされました" と内部例外です。 "アクセスが拒否されました(例外HRESULTから:0x80070005と(E_ACCESSDENIED)。"LDAP SetPasswordアクセスが拒否されました

認証機能が働くここに私の関数です。

public bool Authenticate(string strUserName, string strPassword) 
    { 
     bool authenticated = false; 
     using (
       var entry = new DirectoryEntry("LDAP://myldapserver", strUserName + "@domain", strPassword, 
               AuthenticationTypes.Secure)) 
     { 
      try 
      { 
       object nativeObject = entry.NativeObject; 
       authenticated = true; 
      } 
      catch (DirectoryServicesCOMException ex) 
      { 
       return false; 
      } 

     } 
     return authenticated; 
    } 

とのChangePasswordメソッド;

public bool ChangePassword(string strUserName, string strOldPassword, string strNewPassword) 
    { 
     const long ADS_OPTION_PASSWORD_PORTNUMBER = 6; 
     const long ADS_OPTION_PASSWORD_METHOD = 7; 
     const int ADS_PASSWORD_ENCODE_REQUIRE_SSL = 0; 
     const int ADS_PASSWORD_ENCODE_CLEAR = 1; 
     string strPort = "636"; 
     int intPort; 
     intPort = Int32.Parse(strPort); 

     try 
     { 
      string strUserString = "domain" + @"\" + strUserName.Trim(); 

      var entry = new DirectoryEntry("LDAP://myldapserver", strUserString, strOldPassword, 
              AuthenticationTypes.Secure); 
      var search = new DirectorySearcher(entry); 
      string strFilter = "(SAMAccountName=" + strUserName + ")"; 
      search.Filter = strFilter; 
      SearchResult result = search.FindOne(); 
      DirectoryEntry user = result.GetDirectoryEntry(); 

      user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_PORTNUMBER, intPort }); 
      user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_METHOD, ADS_PASSWORD_ENCODE_CLEAR }); 
      **user.Invoke("SetPassword", new object[] { strNewPassword });** 
      user.CommitChanges(); 
      user.Close(); 
     } 

     catch (Exception exception) 
     { 
      string msg = exception.InnerException.Message; 
      return false; 
     } 
     return true; 
    } 

それは。 SetPasswordプロパティを呼び出すと、expcetionがスローされます。 何か助けていただければ幸いです。

+0

どの回線が故障していますか?どんな方法が失敗していますか? –

+1

ChangePasswordは、行user.Invoke( "SetPassword"、新しいオブジェクト[] {strNewPassword})で失敗するものです。 – user1595357

+0

あなたがトップに投稿したメッセージは、内部の例外ですか?内部の例外には実際に受け取ったCOM例外が含まれているので、私は尋ねます。 –

答えて

1

ここにありますEの例: - あなたは、ユーザーが次回ログオン時にパスワードを変更する必要がある場合

PrincipalContext pr = new PrincipalContext(ContextType.Domain, "corp.local", "OU=" + OU + ",OU=Users,dc=corp,dc=local", username, password); 
UserPrincipal us = new UserPrincipal(pr); 

パスワード

user.SetPassword("setPassword"); 

を変更するには、次のように使用することができます。

user.ExpirePasswordNow(); 
ここ

は、あなたの完全なコードは次のとおりです。 -

public static Boolean ResetPassword(string username, string password, string DomainId, string setpassword, Boolean UnlockAccount,Boolean NextLogon) 
{ 
    PrincipalContext pr = new PrincipalContext(ContextType.Domain, "corp.local", "dc=corp,dc=local", username, password); 
    UserPrincipal user = UserPrincipal.FindByIdentity(pr, DomainId); 

    Boolean flag = false; 
    if (user != null && user.Enabled == true) 
    { 
     if (UnlockAccount) 
     { 
      user.UnlockAccount(); 
     } 
     user.SetPassword(setpassword); 
     if (NextLogon) 
     { 
      user.ExpirePasswordNow(); 
     } 
     user.Save(); 
     flag = true; 
    } 
    else 
     { 
     flag = false; 
     } 
    user.Dispose(); 
    pr.Dispose(); 
    return flag; 
    } 

私はあなたの方法でそれを使用したい場合は、ここで良い記事を見つけたここを見て、

http://www.primaryobjects.com/cms/article66.aspx

+0

ありがとう、ありがとうございました – user1595357

+0

これはうまくいきましたか? – RL89

+0

私はそれを働かせようとしており、結果を投稿します。 – user1595357

関連する問題