4

我在与 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))

4

3 回答 3

9

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

任何一个:

  • 在具有所需权限的用户下运行 AppPool,或者
  • 使用模拟来提升SetPassword呼叫的权限

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

  • 您正在 Visual Studio 开发 Web 服务器下运行应用程序,该服务器在您的用户帐户下运行,该帐户具有必要的权限。在“真正的”IIS 下运行它会在特权较低的帐户下运行它。
  • 在实时环境中,从 Web 服务器到 AD 服务器还有另一台机器跃点,并且凭据不会传递。Web 服务器需要具有网络凭据(作为 AppPool 身份的一部分或对 的调用LogonUser)才能对 AD 进行身份验证。
于 2011-10-31T09:23:20.760 回答
1

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

于 2012-05-08T20:41:06.310 回答
0

如果要更改 AD 的密码,则使用此

AlterUser.Invoke("ChangePassword", OldPassword, newPassword);
于 2016-10-04T07:25:18.193 回答