Active Directory - 调用的目标已引发异常

Posted

技术标签:

【中文标题】Active Directory - 调用的目标已引发异常【英文标题】:Active directory - exception has been thrown by the target of an invocation 【发布时间】:2011-12-15 15:50:05 【问题描述】:

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

【问题讨论】:

请在您的配置文件中给我们ADConnString的形式。您能否提供有关异常的更多详细信息(是哪条指令导致的)。 哪一行抛出异常?调用?提交更改?筛选?您的搜索是否返回任何条目? 抱歉,出于安全问题,我无法为您提供连接字符串。但是,我可以告诉你它正在通过会员配置工作。现在我不能告诉你它导致错误的行或命令,我会尝试调试它......记住它是一个生产环境...... 我已经深入了解错误并得到以下信息:“访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))”。经过快速搜索,我找到了这个链接social.msdn.microsoft.com/Forums/eu/vsreportcontrols/thread/…。但它需要重置机器,所以我会尽可能地尝试...... 【参考方案1】:

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

要么:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

如果你想更改AD的密码,那么你就用这个

AlterUser.Invoke("ChangePassword", OldPassword, newPassword);

【讨论】:

以上是关于Active Directory - 调用的目标已引发异常的主要内容,如果未能解决你的问题,请参考以下文章

Window Azure Active Directory - 服务提供已启动

Windows Server 2016-Active Directory复制概念

从 MVC 查询 Active Directory 会导致:尝试访问已卸载的应用程序域。 (HRESULT 异常:0x80131014)

Azure Active Directory:web api调用另一个web api

使用 Active Directory 令牌从 Angular 到 Web API 应用程序进行安全 API 调用

如何检索 Active Directory 用户列表