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

use*_*080 30 com asp-classic iis-8 windows-server-2012-r2

在Windows Server 2012 R2上,在安装更新KB4340558(更新历史记录)/ KB4338424(已安装的更新)之后,我们无法再使用32位模式在经典ASP中实例化.NET .DLL(interop)server.createobject.我们收到错误0x800A01AD"ActiveX组件无法创建对象"

当我们卸载更新时,错误消失.尽管我付出了最大的努力,但我无法找到卸载的替代解决方案.我们希望重新安装更新并对Windows Server和/或DLL进行必要的更改,以允许正确地实例化COM对象.系统日志中没有线索,CVE数据库中没有线索,也没有ASP生成错误的线索.请帮忙!

key*_*don 34

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

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

最后我设法通过配置来解决问题.显然,网站的身份验证身份现在已经与应用程序池的身份相匹配.或者IUSR不再具有足够的权限.

在此输入图像描述

编辑:19.07.2018

警告!这种变化也有副作用:

不再调用asp-classic事件"Session_OnEnd",因此最终无法释放资源.但也有一个解决方案!

ASP-Config-Property"system.webServer/asp/runOnEndAnonymously"必须为"false",然后事件再次触发.

在此输入图像描述

编辑2:23.07.2018

正如Dijkgraaf指出的那样,微软现在认为这种"新行为"是一个错误.所以我想我的"解决方案"现在应该被视为一种解决方法,直到一个新的补丁来拯救.

  • 将该屏幕截图翻译为英语:在左侧窗格中选择您的网站,在右侧窗格中单击"身份验证",选择"匿名身份验证",单击"编辑",然后选择"应用程序池标识". (9认同)
  • @Lankymart我实际上有匿名*禁用*.我注意到这里有一个非常有趣的怪癖.通过您所描述的设置,在"冷"时访问应用程序的非管理员用户 - 即需要新的工作进程 - 得到错误.只要我或任何其他管理员访问该应用程序,该组件加载就好了,然后*继续*以便为每个人加载正常,直到工作进程回收.我想我必须开始尝试权限. (2认同)

Tim*_*imP 17

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

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

  • 应用程序池 - 应使用特定标识
  • 网站"连接为" - 应使用"应用程序池标识"
  • "身份验证"功能下的"匿名身份验证"选项应使用"应用程序池标识"

最后一个是我们所遗漏的事情 - 多年只考虑前两个意味着我们错误地阅读了上面的伟大建议.


Dij*_*aaf 8

Microsoft已知道此问题,并且相关的KB是"拒绝访问"错误,并且在安装了针对.NET Framework的2018年7月安全和质量汇总更新后,COM激活的应用程序失败

这已经影响了BizTalk,SharePoint,IIS与使用模拟的经典ASP和.NET应用程序.

Classic ASP的变通方法如下

IIS Hosted Classic ASP调用CreateObject for .NET COM对象可能会收到"ActiveX组件无法创建对象"错误:

  • 如果您的网站使用匿名身份验证:更改网站匿名身份验证凭据以使用"应用程序池标识".
  • 如果您的站点使用基本身份验证或Windows身份验证:作为应用程序池标识登录应用程序一次,然后创建.NET COM组件的实例.之后,其他站点用户将能够在没有失败的情况下激活.NET COM组件.
  • 或者,如果您正在使用Windows身份验证并从运行ASP应用程序的Windows Server的控制台访问该网站:创建.NET COM组件的实例也会解决其他站点用户的错误.


sup*_*rt3 5

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

在应用最近的安全 Windows 更新并重新启动操作系统后,我们的应用程序崩溃并出现以下错误:

Microsoft VBScript runtime error '800a01ad'
ActiveX component can't create object: 'NameOfObjectInDLL'
Run Code Online (Sandbox Code Playgroud)

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

IIS > 身份验证 > 匿名身份验证 - 编辑 > “应用程序池身份”

截图1


小智 5

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

在我们的案例中,我们更改了以下 3 个部分(以及新权限的第 4 个部分):

  1. Web 服务器身份验证属性:使用“应用程序池身份”而不是“特定用户”设置匿名身份验证。

  2. 应用程序池“身份”属性:设置为“ApplicationPoolIdentity”而不是“LocalSystem”。

  3. 物理路径的网站“连接为”:设置为“应用程序用户(通过身份验证)”而不是“特定用户”。

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

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