模拟不适用于 Interop.MSClusLib

Posted

技术标签:

【中文标题】模拟不适用于 Interop.MSClusLib【英文标题】:Impersonation does not work with Interop.MSClusLib 【发布时间】:2011-08-22 11:35:18 【问题描述】:

我有一个 WCF Web 服务,其中包含需要在不同用户下运行的不同部分。

其中之一是 clustering,它是使用 Interop.MSClusLib API 实现的。我正在尝试应用 impersonation 指定用户,但它完全被忽略

using (new Impersonator(_impersonation.User, _impersonation.Domain, _impersonation.Password))

    var cluster = new Cluster();
    cluster.Open(clusterName);

(模仿者:http://www.codeproject.com/KB/cs/zetaimpersonator.aspx)

WindowsIdentity.GetCurrent() 获取我正在模拟的用户,但我仍然得到:

访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED)) 在 MSClusterLib.ClusterClass.Open(String bstrClusterName)

当我为该用户设置应用程序池身份时,它确实有效,但这不是我想要做的。

有没有任何方法可以修复?谢谢!

【问题讨论】:

【参考方案1】:

从一位同事那里得到了解释:应用程序中有 2 个级别的身份验证:进程和线程。Impersionation 只设置线程身份,而 Cluster API 似乎使用进程身份。

【讨论】:

【参考方案2】:

将 AppPool 身份更改为模拟用户时未收到错误消息的原因是代码在具有该身份的线程中运行。使用 IIS 中托管的 WCF,服务实例始终在 AppPool 标识下运行。模拟用户不会更改正在运行的线程的安全上下文。

MSClusLib 很可能正在访问“远程”资源以执行其工作。 Windows 模拟不能(许可)访问“远程”资源。您可以通过实施委托而不是模拟来做您需要的事情。您应该查看this MSDN article 以了解模拟和委派在 WCF 中是如何工作的。

【讨论】:

冒充不仅仅是充当呼叫者。在这种情况下,他使用带有预定义帐户和密码的 LogonUser。它与呼叫者的帐户无关。委派不适用。【参考方案3】:

这看起来应该对我有用。我认为您是正确的,IIS 托管是问题所在。检查您的应用程序池帐户是否有“作为操作系统的一部分”。 accessing network files from IIS 上的这篇 MS 支持文章正在按照您的描述进行:

LogonUser 还要求调用 LogonUser 的帐户具有 用户管理器中的“作为操作系统的一部分”权限。经过 默认情况下,IIS 在处理 HTTP 时模拟的大多数用户 请求没有此用户权限。但是,对于“进行中 应用程序”有多种方法可以使您的当前 要更改为 LocalSystem 帐户的安全上下文,该帐户确实具有 “作为操作系统的一部分”管理凭据...

如果这不起作用,我建议在 IIS 之外托管您的服务的快速测试(Visual Studio 服务主机很容易进行此类测试)。在您花更多时间走这条路之前,请确保 IIS 确实是问题所在...

【讨论】:

以上是关于模拟不适用于 Interop.MSClusLib的主要内容,如果未能解决你的问题,请参考以下文章

手动模拟不适用于 Jest

为啥我的模拟器不适用于 NativeScript?

android模拟位置不适用于locationservices.fusedlocationapi

MPNowPlayingInfoCenter 不适用于模拟器 [关闭]

awakeFromNib() 不适用于模拟指标

Android 模拟位置不适用于谷歌地图