连接到在 IIS 上运行的 aspx 代码隐藏中的 COM 接口?
Posted
技术标签:
【中文标题】连接到在 IIS 上运行的 aspx 代码隐藏中的 COM 接口?【英文标题】:Connecting to a COM interface in an aspx code-behind running on IIS? 【发布时间】:2013-03-11 21:08:51 【问题描述】:我创建了一个 Windows 服务(一个基于 Visual Studio ATL 向导的 exe),它公开了一个 COM 接口。作为进程内服务器或 Windows 服务运行没有问题。我需要一个 Windows 服务,因为我需要一些进程在 IIS 访问之外可用。
我一直在创建一些网页 (aspx/C#) 来调用我的服务,并且在 Visual Studio .NET 开发服务器中测试一切正常。现在,我正在尝试将网页推送到 IIS 7(在 Windows 7 上运行)以进行进一步测试。但是,当页面在 IIS 下运行时,对我的 COM 接口的调用都失败并出现错误
“由于以下错误,检索组件的 COM 类工厂失败:80070005 访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))。”
我已验证服务是:
在 HKCR\Clsid\ 下向 Windows 注册(注意,我注册了运行“myservice.exe /RegServer”,因为 regsvr32.exe 仅适用于 dll) myservice.exe 拥有 IIS_IUSRS 用户的读取和执行权限 是一个 64 位的 exe(所以应该在默认的 IIS 应用程序池空间中加载) 在 .NET 开发服务器调试器(但不是 IIS)中运行良好任何想法为什么这不起作用?与 exe vs dll 中包含的 COM 接口有关吗?
IIS 调用 Windows 服务中公开的 COM 接口的任何可能性?
【问题讨论】:
应用池标识呢?它有访问权限吗?你可以改变它的身份来测试它。 【参考方案1】:我相信您需要在 DCOM Config 下授予对您网站的应用程序池进程的访问权限才能使用您的 COM 对象。
转到组件服务 > 计算机 > 我的电脑 > DCOM 配置分支 在列表中找到您的服务的 AppID 或名称。右键单击它并选择属性。 打开“安全”选项卡 选择启动和激活权限并选择自定义。 授予应用程序池进程(可能是 ASPNET,但检查您站点的 IIS 应用程序池属性)以下内容:本地启动和本地激活。如果这能解决您的问题,请告诉我们。
顺便说一句:
> is a 64bit exe (so should load in the default IIS app-pool space)
这并不完全正确。应用程序池是 ISS 控制的进程。无论如何,您的服务都在其自己的单独进程上运行。因此,您的服务与 IIS 应用程序池无关。
【讨论】:
【参考方案2】:它看起来很像一个安全/权限问题 - 所以首先确保 IIS 工作人员在其下运行的任何用户都有足够的权限,特别是检查您的 ASPNET 组是否有权使用 COM(我认为它没有默认)。
编辑 - 发布后,我确实找到了另一个可能有帮助的帖子 - take a look here too
【讨论】:
【参考方案3】:谢谢各位。我非常感谢您的回复。您的信息为我指明了正确的方向。问题确实是安全\权限问题。为了使问题更加复杂,每当我重建我的服务时,我为 IIS_IUSRS 设置的权限都会从 exe 中清除,因此我看到的一些故障是由于 service.exe 上的简单权限造成的。因此,如果您在开发期间开始看到间歇性错误访问您的 COM 对象,请在重新构建后检查您的 exe 的权限!我希望这对其他人有所帮助。
为了完成,这是我解决问题的方法:
将我的服务应用程序池的“身份”更改为“LocalSystem”(因为我的 COM 在系统帐户下运行的 Windows 服务中 - 大多数人不需要此级别)(IIS 管理器 | 应用程序池 | 右键单击在您的应用程序池中 | 高级设置 | 身份【讨论】:
嗯,作为 LocalSystem 运行肯定会消除安全错误,但这并不是一个好主意。 LocalSystem 是机器上最强大的帐户,您确实应该将其使用限制在绝对必要的地方。如果你只是写一些东西来玩编码技术,那很好。如果你想以此来制作产品,甚至是公司内部的应用程序,你真的应该调查这个问题。不必要地使用 LocalSystem 类似于从铰链上卸下一扇门,因为钥匙太难使用了。 "添加了执行权限...对于 IIS_IUSRS" 这很奇怪。唯一需要执行权限才能运行服务的是服务控制管理器 (SCM),它作为 LocalSystem 运行。您的 IIS 应用程序不运行该服务;它通过 DCOM 基础结构启动 COM 对象,并且 DCOM 与 SCM 对话以在必要时启动服务。除非您对应用的描述中缺少某些内容。 谢谢欧元。您是正确的,不需要 IIS_IUSRS 的执行权限。我更新了上面的回复。以上是关于连接到在 IIS 上运行的 aspx 代码隐藏中的 COM 接口?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 10 上通过 ODBC 连接到 Access 数据库时出现 IIS 500 错误
IIS无法使用SQL Server身份验证连接到SQL Server