首页 > 解决方案 > 自 KB4338419 起,C# COM 对象无法再从经典 ASP 创建

问题描述

我们最近在一个依赖于一组 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 对象的实例化或访问方式进行了一些安全更改,可以理解的是,没有详细说明,我可以相信我们做错了什么或没有做现在认为必不可少的事情,但我找不到任何建议我们应该做什么的信息!

您的帮助将不胜感激!蒂姆

标签: c#iisasp-classic

解决方案


请查看更改您的匿名用户以匹配您的应用程序池身份是否可以解决问题:

在此处输入图像描述


推荐阅读