我将以下代码作为Web应用程序的一部分,以便我的Active Directory用户能够更新其密码(同时用于活动目录和gmail)。我正在使用C#与System.DirectoryServices.AccountManagement。
此代码一直有效,直到昨天
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]:LDAP已连接,正在搜索SAMAccountName的目录
[上午8:37:01]:获取用户条目。
[8:37:01 AM]:设置密码
[上午8:37:01]:无法为jason重置Windows密码。
调用目标抛出了异常。
系统无法联系域控制器来为身份验证请求提供服务。请稍后再试。 (HRESULT异常:0x800704F1)
" force"选项使用" SetPassword"仍然工作正常,但" ChangePassword"非管理员用户可以调用的方法不会。
答案 0 :(得分:1)
更改userPrincipal.ChangePassword(“Old pass”,“New Pass”);到userPrincipal.SetPassword(model.NewPassword);
答案 1 :(得分: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();
}
答案 2 :(得分:0)
本月早些时候,Microsoft released a security patch解决了密码更改方面的一些漏洞。具体而言,更改密码后,更新阻止了在更改密码后Kerberos身份验证失败后回退到NTLM身份验证。
您可能想要了解有关更新here的更多信息。
答案 3 :(得分:0)
Microsoft已更新此文章:https://support.microsoft.com/en-us/kb/3177108。在这里,他们给了我们原始"修复"以及使用Kerberos和自助密码重置的一些技巧。
自2016年10月11日起,Microsoft重新发布了与https://technet.microsoft.com/en-us/library/security/ms16-101.aspx相关联的修补程序,以解决原始更新导致的问题(您可以在https://support.microsoft.com/en-us/kb/3177108中阅读,包括您无法再更改的事实本地帐户上的密码。)