【发布时间】:2018-07-12 16:50:19
【问题描述】:
我们最近在一个依赖于一组 C# COM 组件的经典 ASP 应用程序中遇到了一个问题,我们发现 KB4338419 中引入的更改对我们造成了破坏!
我们已将问题简化为基本问题:
创建了最简单的 C# COM 库:
using System;
using System.Runtime.InteropServices;
namespace TestComObject
{
[ComVisible(true)]
[Guid("B5C7370F-0EB5-4279-885C-9C169F9CBAA5")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1
{
public string GetString()
{
return Guid.NewGuid().ToString("D");
}
}
}
使用 RegAsm /codebase 在服务器上注册它
创建了最简单的 ASP 脚本来使用它:
<%
Const COM_OBJECT_NAME = "TestComObject.Class1"
Dim co
Set co = Server.CreateObject(COM_OBJECT_NAME)
Response.Write co.GetString()
%>
访问页面时,我们看到:
Microsoft VBScript runtime error '800a01ad'
ActiveX component can't create object
/Default.asp, line 4
Web 应用程序在 IIS (8) 中运行,使用专用的非特权用户帐户。 (真实的)代码多年来一直运行良好,权限有限。 如果我将用户添加到管理员组,COM 对象将被实例化。作为普通用户,页面/代码失败。如果我将 progID 更改为非 .Net 库,一切正常
文件系统权限很好。如果我编写一个 .vbs 等效文件并以非特权用户身份执行,一切正常。
KB4338419 的文章暗示对 .Net COM 对象的实例化或访问方式进行了一些安全更改,可以理解的是,没有详细说明,我可以相信我们做错了什么或没有做现在被认为必不可少的东西,但我找不到任何建议我们应该做什么的信息!
您的帮助将不胜感激! 蒂姆
【问题讨论】:
-
@lankymart - 同意,这是相同的问题和原因,尽管我的情况与the other question 中的其他人相同。作为记录,我们运行的是 64 位而不是 32 位,并且必须以特定用户身份运行我们的网站和应用程序池,才能访问网络共享和数据库。
-
这里有同样的问题。可能有更多信息:serverfault.com/q/920671/362722
标签: c# iis asp-classic