【问题标题】:COMException CreateInstance failed on publishCOMException CreateInstance 在发布时失败
【发布时间】:2016-11-16 08:09:54
【问题描述】:

我目前正在开发一个引用第三方 api dll 的 C# WebAPI 项目。该组件是我添加到 Visual Studio 项目中的一个简单 COM 引用。
Web API 发布在 Intranet 服务器 (IIS) 上,集成安全性和用户模拟已打开,匿名身份验证已关闭。

在我的本地机器上的 Visual Studio (2015) 中运行 Web api 时,一切正常。

在我们的 IIS 服务器上运行已发布的 web api 时,一切正常,但是当我向使用第三方库的控制器操作发送请求时,我收到以下错误:

System.Runtime.InteropServices.COMException
附加信息:
创建实例失败。
在 ThirdPartyLib.Connect()

使用他们的安装程序在服务器(以及我的开发机器)上安装了第三方依赖项。这注册了一组 dll 并安装了随附的软件。我已经验证了正确的安装。事实上,使用相同 dll 的简单 winforms 应用程序就可以正常工作。

进程监视器显示 w3wp.exe 正在使用正确的 dll。

我不确定我错过了什么?
如果这是一个权利问题,我将如何解决?

【问题讨论】:

  • 项目是否有足够的权限访问dll?
  • 我不确定如何找出答案。 UAC 已关闭。它是一个使用集成安全性的 Intranet 服务器,因此当我访问它时,我的帐户被假冒。
  • @ThomasWeller 我已经编辑了这篇文章并进行了一些额外的说明。
  • 将应用程序池用户更改为具有更高权限的用户进行测试。您也可以以更高的权限运行该部分代码,例如查看at this
  • @RezaAghaei 这解决了问题。还有一个问题:如果启用了用户模拟(并且用户应该有足够的权限),为什么应用程序池用户仍然需要管理员权限?

标签: c# visual-studio asp.net-web-api


【解决方案1】:

您可以将应用程序池标识更改为具有更高权限的用户。

注意:您可以使用 ASP.NET Impersonation 使用 Web 配置以特定身份运行整个应用程序,或使用代码以使用特定身份仅运行部分代码。例如,我测试了<identity impersonate="true" userName="r.aghaei" password="mypassword"/> 的文件系统权限,它工作正常。只需注意 webconfig 或代码中的模拟,如果应用程序池用户有足够的权限允许模拟,则可以正常工作。有关如何使用模拟客栈配置或代码的更多信息,请参阅this MSDN 知识库文章。

也不要忽视最小特权主体。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多