我们最近在依赖于一组C#COM组件的Classic 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)中运行。 (真实的)代码已经运行了好几年了,并且特权有限。 如果将用户添加到Administrators组,则将实例化COM对象。作为普通用户,页面/代码将失败。如果我将progID更改为非.Net库,则一切正常
文件系统权限很好。如果我编写等效的.vbs并以非特权用户身份执行,则一切正常。
KB4338419的文章暗示对.Net COM对象的实例化或访问方式进行了一些安全性更改,并且可以理解的是,没有涉及太多细节,我可以相信我们做错了什么或没有做现在被认为必不可少的事情,但是我找不到任何提示我们应该做的信息!
您的帮助将不胜感激! 蒂姆