安装 Windows Update KB4340558 后,如何在经典 ASP 中正确实例化 32 位 COM 对象?
Posted
技术标签:
【中文标题】安装 Windows Update KB4340558 后,如何在经典 ASP 中正确实例化 32 位 COM 对象?【英文标题】:How do I properly instantiate 32-bit COM objects in classic ASP after installing Windows Update KB4340558? 【发布时间】:2018-12-19 17:16:01 【问题描述】:在 Windows Server 2012 R2 上,安装更新 KB4340558(更新历史记录)/KB4338424(已安装更新)后,我们无法再使用 @987654323 在经典 ASP 中以 32 位模式实例化 .NET .DLL(互操作) @。我们收到错误 0x800A01AD “ActiveX 组件无法创建对象”
当我们卸载更新时,错误消失了。尽管我尽了最大努力,但我无法找到卸载的替代解决方案。我们更愿意重新安装更新并对 Windows Server 和/或 DLL 进行任何必要的更改,以允许正确实例化 COM 对象。系统日志中没有线索,CVE 数据库中没有线索,ASP 正在生成的错误中也没有线索。请帮忙!
【问题讨论】:
如果你使用普通的 CreateObject 而不是 Server.CreateObject 会有什么改变吗? 使用普通 CreateObject 的结果相同。 在应用程序池配置中Enable 32-bit Applications
是否设置为True
?
是的。该问题是安装昨天(2018 年 7 月 10 日)发布的 .NET 安全汇总的结果。该控件在安装更新之前运行良好,在卸载更新后再次运行。知识库文章和 CVE 数据库没有直接解决汇总修复的任何可能导致此错误的更改 - 或者我错过了它们。
这两个是紧急安全补丁,用于解决最近披露的安全漏洞。我假设在修复问题时,补丁没有通过更多的兼容性测试,比如你的情况。因此,您唯一的希望是通过其支持服务来追随微软,以便他们发布比当前版本更好的补丁。这个网站对你帮助不大。
【参考方案1】:
我们也受到多个客户的影响。
我排除了我们的程序集的无效强名称签名,因为来自框架本身的 .NET 程序集也受到该拒绝访问错误的影响。
最后我设法通过配置解决了这个问题。 显然,网站的身份验证现在必须与应用程序池的身份相匹配。或者IUSR没有足够的权限。
编辑:19.07.2018
警告!这种变化也有副作用:
不再调用 asp-classic 事件“Session_OnEnd”,因此最终无法释放资源。 但也有解决办法!
ASP-Config-Property "system.webServer/asp/runOnEndAnonymously" 必须为 "false",然后事件再次触发。
编辑 2:23.07.2018
正如Dijkgraaf 所指出的,微软现在认为这种“新行为”是一个错误。所以我想我的“解决方案”现在应该被视为一种解决方法,直到一个新的补丁来救援。
【讨论】:
将该屏幕截图翻译成英文:在左侧窗格中选择您的网站,单击右侧窗格中的身份验证,选择匿名身份验证,单击编辑,然后选择应用程序池身份。 在我们的例子中,应用程序池在操作系统的NetworkService
帐户下运行。我唯一担心的是引入在此帐户下运行 IIS 的任何意外安全漏洞。虽然我想不出任何想法......想法?
顺便说一句,将 IIS 用户与应用程序池用户对齐,以便在安装补丁后再次进行操作。我仍然会喜欢有关安全影响的想法。
如果您必须使用特定的 Windows 用户来执行池,这将不起作用。
@Lankymart 我实际上有匿名禁用。我注意到这里有一个非常有趣的怪癖。通过您描述的设置,在“冷”时访问应用程序的非管理员用户 - 即需要一个新的工作进程 - 得到错误。只要我或任何其他管理员访问该应用程序,组件就会正常加载,然后继续为每个人正常加载,直到工作进程回收。我想我必须开始尝试权限。【参考方案2】:
我们以特定身份运行我们的应用程序池,以启用网络共享和数据库访问。在阅读了上面的@keydon 的answer 之后,我也认为我们被困住了。
但是,我们必须在三个地方配置身份:
应用程序池 - 应使用特定标识 网站“Connect As” - 应使用“应用程序池标识” 身份验证功能下的匿名身份验证选项 - 应使用“应用程序池标识”最后一个是我们缺少的东西 - 多年来只考虑前两个意味着我们误读了上面的好建议。
【讨论】:
无需道歉,这回答了问题并提供了额外的信息。您有权发布它。【参考方案3】:Microsoft 已意识到此问题,相关 KB 为 "Access Denied" errors and applications with COM activation fail after installing July 2018 Security and Quality Rollup updates for .NET Framework
这影响了 BizTalk、SharePoint、IIS 以及使用模拟的经典 ASP 和 .NET 应用程序。
Classic ASP 的解决方法如下
IIS Hosted Classic ASP 为 .NET COM 对象调用 CreateObject 可能会收到“ActiveX 组件无法创建对象”错误:
如果您的网站使用匿名身份验证:更改网站匿名身份验证凭据以使用“应用程序池身份”。 如果您的站点使用基本身份验证或 Windows 身份验证:以应用程序池身份登录应用程序一次,然后创建 .NET COM 组件的实例。 之后,其他站点用户将能够激活 .NET COM 组件而不会失败。 或者,如果您使用 Windows 身份验证并从运行 ASP 应用程序的 Windows Server 控制台访问网站:创建 .NET COM 组件的实例也可以解决其他网站用户的错误。
【讨论】:
【参考方案4】:我们支持在 IIS 匿名身份验证中运行的经典 ASP 站点。应用程序实例化一个公开为 COM 可见的 DLL .NET 对象。
应用最近的安全 Windows 更新并重新启动操作系统后,我们的应用程序崩溃并出现以下错误:
Microsoft VBScript runtime error '800a01ad'
ActiveX component can't create object: 'NameOfObjectInDLL'
在我们的例子中,最后一条建议解决了我们的问题。
IIS > 身份验证 > 匿名身份验证 - 编辑 > “应用程序池标识”
screenshot1
【讨论】:
此解决方法对我们不起作用。此外,在安装 7 月 Windows 更新后,我们无法再重新启动 www 服务。该服务永远锁定在“停止”模式,我们必须重新启动服务器。我们必须从 7 月的 Windows 更新中卸载所有 KB。 我在之前的评论中提到的 www 服务重启问题似乎与这个问题有关。请检查此线程:forums.iis.net/t/…【参考方案5】:这只是为了确认keydon提供的解决方案,结合TimP提供的解决方案。并感谢他们!
在我们的例子中,我们更改了以下 3 个部分(另外第 4 个部分用于新权限):
Web 服务器身份验证属性:使用“应用程序池标识”而不是“特定用户”设置匿名身份验证。
应用程序池“Identity”属性:设置为“ApplicationPoolIdentity”而不是“LocalSystem”。
物理路径的网站“连接为”:设置为“应用程序用户(传递身份验证)”而不是“特定用户”。
在 Web 应用程序文件所在的共享文件夹中添加“应用程序池标识用户名”权限。看看https://docs.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities#securing-resources
谢谢!! (很抱歉,我无法为您的解决方案投票,因为我是初学者,没有任何声誉)
【讨论】:
以上是关于安装 Windows Update KB4340558 后,如何在经典 ASP 中正确实例化 32 位 COM 对象?的主要内容,如果未能解决你的问题,请参考以下文章
Windows6.1-KB2731771-x64.msu 提示此更新不适用于您的计算机 ie10 ie11 安装失败
更新失败Windows 8.1 更新 (KB2919355)
Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
Windows 7 update 補丁查更新历史记录成功,但查看已安装的更新未发现补丁
求助,求助,Windows 2012 r2 Update3 的语言包
python3.5安装停留在C Runtime Update(KB2999226)不动了或者python安装提示0x80240017错误?