4

我创建了一个 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 接口的任何可能性?

4

3 回答 3

2

我相信您需要在 DCOM Config 下授予对站点应用程序池进程的访问权限才能使用您的 COM 对象。

  • 转到组件服务
  • > 计算机 > 我的电脑 > DCOM 配置分支
  • 在列表中找到您的服务的 AppID 或名称。右键单击它并选择属性。
  • 打开安全选项卡
  • 选择启动和激活权限并选择自定义。
  • 授予应用程序池进程(可能是 ASPNET,但检查您站点的 IIS 应用程序池属性)以下内容:本地启动和本地激活。

如果这能解决您的问题,请告诉我们。

顺便:

> is a 64bit exe (so should load in the default IIS app-pool space)

这并不完全正确。应用程序池是 ISS 控制的进程。无论如何,您的服务都在其自己的单独进程上运行。因此,您的服务与 IIS 应用程序池无关。

于 2013-03-22T12:04:16.557 回答
1

It looks very much like a security/permissions problem - so first make sure that whatever user the IIS worker is running under has sufficient rights and in particular check that your ASPNET group has permission to use COM (I think it doesn't by default).

EDIT - after posting that, I did find another post that might help - take a look here too

于 2013-03-22T07:46:14.443 回答
1

多谢你们。我非常感谢您的回复。您的信息为我指明了正确的方向。问题确实是安全\权限问题。为了使问题更加复杂,每当我重建我的服务时,我为 IIS_IUSRS 设置的权限都会从 exe 中清除,因此我看到的一些故障是由于 service.exe 上的简单权限造成的。因此,如果您在开发期间开始看到间歇性错误访问您的 COM 对象,那么请在重新构建后检查您的 exe 的权限!我希望这对其他人有所帮助。

为了完成,这是我解决问题的方法:

  • 将我的服务应用程序池的“身份”更改为“LocalSystem”(因为我的 COM 在系统帐户下运行的 Windows 服务中 - 大多数人不需要此级别)(IIS 管理器 | 应用程序池 | 右键单击​​您的应用程序池 | 高级设置 | 身份
于 2013-03-22T17:09:41.627 回答