模拟不能与Interop.MSClusLib一起工作

本文关键字:一起 工作 MSClusLib Interop 不能 模拟 | 更新日期: 2023-09-27 18:06:31

我有一个WCF web服务,有不同的部分需要在不同的用户下运行。

其中之一是集群,它是使用互操作实现的。MSClusLib API。
我试图应用模拟指定的用户,但它完全得到忽略
using (new Impersonator(_impersonation.User, _impersonation.Domain, _impersonation.Password))
{
    var cluster = new Cluster();
    cluster.Open(clusterName);
}

(演员:http://www.codeproject.com/KB/cs/zetaimpersonator.aspx)

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

访问被拒绝。(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))在MSClusterLib.ClusterClass。打开(字符串bstrClusterName)

当我将应用程序池标识设置为该用户时,它确实工作,但这不是我想要做的。

是否有任何方法可以使固定?
谢谢!

模拟不能与Interop.MSClusLib一起工作

得到同事的解释:
应用程序中有两种级别的身份验证:进程和线程。
impsionation只设置线程标识,而Cluster API似乎使用进程标识。

当您将appool标识更改为模拟用户时没有得到错误的原因是代码运行在具有该标识的线程中。在IIS中托管WCF时,服务实例总是以AppPool身份运行。模拟用户不会改变正在运行的线程的安全上下文。

MSClusLib很可能正在访问"远程"资源来执行其工作。Windows模拟不能够(在权限方面)访问"远程"资源。通过实现委托而不是模拟,您可以完成所需的工作。您应该阅读这篇MSDN文章,了解模拟是如何进行的。

这看起来应该对我有用。我认为你是正确的,IIS主机是问题所在。检查您的应用程序池帐户是否有"作为操作系统的一部分"。这篇关于从IIS访问网络文件的MS支持文章正在做您所描述的:

LogonUser还要求调用LogonUser的帐户具有用户管理器中的"作为操作系统的一部分"特权。通过默认情况下,IIS在处理HTTP时模拟的大多数用户请求者没有此用户权限。然而,在过程中"应用程序"有很多方法可以引起你的电流将安全上下文更改为LocalSystem帐户,该帐户确实具有"作为操作系统的一部分"管理凭据…

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