C#Active Directory调用" ChangePassword"无法联系域名

时间:2016-08-24 13:24:49

标签: c# active-directory directoryservices change-password account-management

我将以下代码作为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"非管理员用户可以调用的方法不会。

4 个答案:

答案 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中阅读,包括您无法再更改的事实本地帐户上的密码。)