2011-10-06 149 views
1

起初請原諒我的英文,這不是我的母語。更改Active Directory密碼

我正在開發一個管理Active Directory的Web平臺。我可以創建,刪除和編輯組,用戶,OU等。

當連接的用戶想要用平臺更改自己的密碼時,它會失敗。

它來自DirectoryEntry.Invoke

我用DirectoryServices.DirectoryEntry

directoryEntry.Invoke("SetPassword", password); 
directoryEntry.Commit(); 

所以,我想System.DirectoryServices.AccountManagement:

PrincipalContext ctx = new PrincipalContext(ContextType.Machine); 
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, Username); 
user.SetPassword(password_); 
user.Save(); 

不同的方式,同樣的問題。

只有當用戶試圖編輯自己的密碼時,它纔會失敗。

任何幫助將不勝感激。

+0

可能重複[如何programaticly變更Active Directory密碼(http://stackoverflow.com/questions/1066131/how-to-programaticly-change-active-directory-password) – JMax

回答

1

正如保羅所說,您不能在沒有額外權限的情況下致電重置密碼。要調用ChangePassword,你需要這樣的供應以前的密碼:

directoryEntry.Invoke("ChangePassword", oldPassword, newPassword); 
directoryEntry.Commit(); 
+0

當Paolo提示它時,我試過這段代碼,結果是一樣的:。調用問題。而且我使用DirectoryServices.AccountManagement,錯誤說我必須檢查密碼策略(長度,複雜度等)。我已禁用它們。所以,這個問題可能與ACE和允許通過編程更改自己的密碼有關。 – Gnial0id

+0

我試過編輯ACE,使用SecurityDescriptor,AccessControlList等,它失敗了。它經常發生:「安全ID結構無效」。我試着用PrincipalContext及其方法UserCannotChangePassword = false,這裏解釋(http://stackoverflow.com/questions/1761312/active-directory-properties)或這裏(http://msdn.microsoft.com/en-us/library /windows/desktop/aa746398%28v=vs.85%29.aspx),但它似乎沒用。 – Gnial0id

+0

發生的錯誤與此處相同:http:// stackoverflow。COM /問題/ 5946150 /安全-ID-結構無效,越來越-這個錯誤,當設定最新securityd,但解決方案並不爲我工作。 – Gnial0id

0

這是Windows的限制:用戶不能重置他自己的密碼,即在不提供舊密碼的情況下更改密碼。

您只能更改自己的密碼,即提供舊密碼和新密碼。
請嘗試使用ChangePassword方法。

+0

感謝您的回覆。我試過你的解決方案,並且失敗了。當使用DirectoryEntry時,它會導致相同的.Invoke問題。當我使用PrincipalContext方式時,錯誤說我必須檢查密碼策略(長度,複雜度等)。我已禁用它們。 O.o – Gnial0id

0

更改密碼需要用戶的舊密碼,設置新密碼,重置密碼權限需要誰重置password.With AD的默認權限的人,才管理員和帳戶操作員可以重置密碼。

2

試試看看這個代碼。它爲我,

public void ChangeMyPassword(string domainName, string userName, string currentPassword, string newPassword) 
{ 
    try 
    { 
     string ldapPath = "LDAP://192.168.1.xx"; 
     DirectoryEntry directionEntry = new DirectoryEntry(ldapPath, domainName + "\\" + userName, currentPassword); 
     if (directionEntry != null) 

     { 
      DirectorySearcher search = new DirectorySearcher(directionEntry); 
      search.Filter = "(SAMAccountName=" + userName + ")"; 
      SearchResult result = search.FindOne(); 
      if (result != null) 
      { 
       DirectoryEntry userEntry = result.GetDirectoryEntry(); 
       if (userEntry != null) 
       { 
        userEntry.Invoke("ChangePassword", new object[] { currentPassword, newPassword }); 
        userEntry.CommitChanges(); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
+0

哇,我工作太先試試! – TruMan1

相關問題