安装 Windows 更新 KB4340558 后如何在经典 ASP 中正确实例化 32 位 COM 对象?

How do I properly instantiate 32-bit COM objects in classic ASP after installing Windows Update KB4340558?

在 Windows Server 2012 R2 上,安装更新 KB4340558 (update history) / KB4338424(已安装的更新)后,我们无法再在 32 位的经典 ASP 中实例化 .NET .DLL(互操作)使用 server.createobject 的模式。我们收到错误 0x800A01AD "ActiveX component can't create object"

当我们卸载更新时,错误消失了。尽管我尽了最大努力,但我无法找到替代的卸载解决方案。我们宁愿重新安装更新并对 Windows 服务器 and/or DLL 进行任何必要的更改,以允许正确实例化 COM 对象。系统日志中没有任何线索,CVE 数据库中没有任何线索,ASP 正在生成的错误中也没有任何线索。请帮忙!

我们也受到了多个客户的影响。

我排除了程序集的无效强名称签名,因为框架本身的 .NET 程序集也受到拒绝访问错误的影响。

终于通过配置解决了问题。 显然,网站的身份验证现在必须与应用程序池的身份相匹配。或者 IUSR 没有足够的权限。

编辑:2018 年 7 月 19 日

警告!此更改也有副作用:

asp-经典事件"Session_OnEnd"不再被调用,因此最终无法再释放资源。 但也有解决办法!

ASP-Config-属性 "system.webServer/asp/runOnEndAnonymously" 必须是 "false",然后事件再次触发。

编辑 2:2018 年 7 月 23 日

正如 指出的那样,Microsoft 现在将此 "new behaviour" 视为一个错误。所以我想我的"solution"现在应该被认为是一种解决方法,直到一个新的补丁出现。

我们运行我们的应用程序池在特定身份下,以启用网络共享和数据库访问。我也认为我们在阅读上面的@keydon 的 后被卡住了。

但是,有3个地方我们必须配置身份:

  • 应用程序池 - 应使用特定标识
  • 网站 "Connect As" - 应该使用 "Application pool identity"
  • 身份验证功能下的匿名身份验证选项 - 应使用 "Application pool identity"

最后一个是我们遗漏的东西 - 多年来只考虑前两个意味着我们误读了上面的重要建议。

我们在 IIS 匿名身份验证中支持经典 ASP 站点 运行。应用程序实例化公开为 COM 可见的 DLL .NET 对象。

应用最近的安全措施后 Windows 更新并重新启动 OS 我们的应用程序崩溃并出现以下错误:

Microsoft VBScript runtime error '800a01ad'
ActiveX component can't create object: 'NameOfObjectInDLL'

在我们的案例中,最后一条建议解决了我们的问题。

IIS > 身份验证 > 匿名身份验证 - 编辑 > "Application pool identity"

screenshot1

这里只是为了确认keydon提供的解决方案,结合TimP提供的解决方案。并感谢他们!!

在我们的案例中,我们更改了以下 3 个部分(另外还有第 4 个部分用于新权限):

  1. Web 服务器身份验证属性:将匿名身份验证设置为 "Application pool identity" 而不是 "Specific User"。

  2. 应用程序池"Identity" 属性:设置为"ApplicationPoolIdentity"而不是"LocalSystem"。

  3. 物理路径的网站 "Connect As":设置为 "Application user (pass-through authentication)" 而不是 "Specific User"。

  4. 在 Web 应用程序文件所在的共享文件夹中为“Application Pool Identity 用户名”添加权限。看看https://docs.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities#securing-resources

谢谢!! (很抱歉,我不能给你的解决方案投票,因为我是初学者,我没有任何声誉)

Microsoft 已意识到该问题,相关知识库文章为 "Access Denied" errors and applications with COM activation fail after installing July 2018 Security and Quality Rollup updates for .NET Framework

这影响了 BizTalk、SharePoint、具有经典 ASP 的 IIS 和使用模拟的 .NET 应用程序。

Classic ASP 的解决方法如下

IIS Hosted Classic ASP calling CreateObject for .NET COM objects may receive an "ActiveX component can't create object" error:

  • If your web site uses Anonymous Authentication: Change the Web Site Anonymous Authentication credentials to use the "Application pool identity".
  • If your site uses Basic Authentication or Windows Authentication: Log into the application once as the application pool identity, then create an instance of the .NET COM component. Afterwards other site users will be able to active the .NET COM component without the failure.
  • Alternatively, if you are using Windows Authentication and accessing the web site from the console of the Windows Server where the ASP application runs: Creating an instance of the .NET COM component also resolves error for other site users.