活动目录 - 调用目标抛出了异常

时间:2011-10-26 11:23:35

标签: asp.net active-directory reset-password

我在与Active Directory不同的服务器中有一个Web应用程序,我想更改用户密码。代码是下一个:

string newPassword = Membership.GeneratePassword(int.Parse(WebConfigurationManager.AppSettings["passLenght"]),
                                int.Parse(WebConfigurationManager.AppSettings["passNonAlpha"]));

DirectoryEntry de = new DirectoryEntry(WebConfigurationManager.ConnectionStrings["ADConnString"].ConnectionString,
WebConfigurationManager.AppSettings["ADAdmin"], WebConfigurationManager.AppSettings["ADAdminPass"]);

DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(objectClass=user) (userPrincipalName=" + name + "))";

SearchResultCollection results = deSearch.FindAll();

if (results.Count == 1)
{
   foreach (SearchResult OneSearchResult in results)
   {
      DirectoryEntry AlterUser = OneSearchResult.GetDirectoryEntry();
      AlterUser.AuthenticationType = AuthenticationTypes.Secure;
      AlterUser.Invoke("SetPassword", newPassword);
      AlterUser.CommitChanges();
      AlterUser.Close();
   }
}

当我在我的开发环境(Active Directory和Web应用程序在同一台服务器上)运行时,它正在运行。但是当我尝试在生产环境中运行它时,我遇到了下一个错误:

  

调用目标抛出了异常

我错过了什么?

感谢。

编辑:

我可以深入了解异常错误,我得到了这个:

  

访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

3 个答案:

答案 0 :(得分:8)

权限是问题所在。运行ASP.NET代码的帐户没有设置帐户密码的权限。

或者:

  • 在具有所需权限的用户下运行AppPool,或
  • 使用impersonation提升SetPassword来电
  • 的权限

它在您的开发环境中工作/生产失败的原因可能是由于:

的组合
  • 您正在以您的用户帐户运行的Visual Studio开发Web服务器下运行该应用程序,该用户帐户具有必要的权限。在“真正的”IIS下运行它将在权限较低的帐户下运行它。
  • 在实时环境中,有另一台机器从Web服务器跳到AD服务器,并且凭据不会被传递。 Web服务器需要具有网络凭据(作为AppPool标识的一部分或对LogonUser的调用)才能向AD进行身份验证。

答案 1 :(得分:1)

代码看起来正确。这可能会发生,因为您通过Active Directory发送的密码不符合最低要求。尝试使用更复杂的密码,例如“M2k3ThisWork!”

答案 2 :(得分:0)

如果您想更改AD的密码,请使用此

Timestamp('2004-03-29 00:00:00-0456', tz='America/New_York')