更改Active Directory密码
起初请原谅我的英文,这不是我的母语。更改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();
不同的方式,同样的问题。
只有当用户试图编辑自己的密码时,它才会失败。
任何帮助将不胜感激。
正如保罗所说,您不能在没有额外权限的情况下致电重置密码。要调用ChangePassword,你需要这样的供应以前的密码:
directoryEntry.Invoke("ChangePassword", oldPassword, newPassword);
directoryEntry.Commit();
当Paolo提示它时,我试过这段代码,结果是一样的:。调用问题。而且我使用DirectoryServices.AccountManagement,错误说我必须检查密码策略(长度,复杂度等)。我已禁用它们。所以,这个问题可能与ACE和允许通过编程更改自己的密码有关。 – Gnial0id
我试过编辑ACE,使用SecurityDescriptor,AccessControlList等,它失败了。它经常发生:“安全ID结构无效”。我试着用PrincipalContext及其方法UserCannotChangePassword = false,这里解释(http://*.com/questions/1761312/active-directory-properties)或这里(http://msdn.microsoft.com/en-us/library /windows/desktop/aa746398%28v=vs.85%29.aspx),但它似乎没用。 – Gnial0id
发生的错误与此处相同:http:// *。COM /问题/ 5946150 /安全-ID-结构无效,越来越-这个错误,当设定最新securityd,但解决方案并不为我工作。 – Gnial0id
这是Windows的限制:用户不能重置他自己的密码,即在不提供旧密码的情况下更改密码。
您只能更改自己的密码,即提供旧密码和新密码。
请尝试使用ChangePassword
方法。
感谢您的回复。我试过你的解决方案,并且失败了。当使用DirectoryEntry时,它会导致相同的.Invoke问题。当我使用PrincipalContext方式时,错误说我必须检查密码策略(长度,复杂度等)。我已禁用它们。 O.o – Gnial0id
更改密码需要用户的旧密码,设置新密码,重置密码权限需要谁重置password.With AD的默认权限的人,才管理员和帐户操作员可以重置密码。
试试看看这个代码。它为我,
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;
}
}
的
哇,我工作太先试试! – TruMan1
可能重复[如何programaticly变更Active Directory密码(http://*.com/questions/1066131/how-to-programaticly-change-active-directory-password) – JMax