2011-10-06 151 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

相关问题