查看: 16|回复: 2

[文章教程] Windows 11 更新导致经典 ASP 不兼容:Active Server Pages error 'ASP 0240' Scrip...

[复制链接]
xuanxiao 发表于 3 天前 | 显示全部楼层 |阅读模式
VBScript/JScript 混合使用引发 IActiveScript::SetScriptState 异常。

起因:2025 年 6 月 2 日更新到 Windows 11 后,我在使用 IIS 的Classic ASP 应用程序上遇到了严重问题,这些应用程序在服务器端同时使用 VBScript 和 JScript。

之前运行多年而未出现问题的ASP代码现在随机显示以下错误

  1. Active Server Pages error 'ASP 0240' Script Engine Exception
  2. A ScriptEngine threw exception 'C0000005' in 'IActiveScript::SetScriptState()' from 'CActiveScriptEngine::ReuseEngine()'.
复制代码


在 Windows 应用程序事件日志中,我看到类似以下的消息:
  1. Eccezione del modulo di script 'C0000005' in 'IActiveScript::SetScriptState()' da 'CActiveScriptEngine::ReuseEngine()'
复制代码



这会导致应用程序对许多请求抛出 HTTP 1.1/500 内部服务器错误。有时页面可以加载,但更多时候它会失败,看似随机。

技术背景:
环境:IIS 10 / Classic ASP / Windows 11
脚本:我的许多 ASP 页面结合了<% ... %>块(VBScript)和...部分。

我依赖 JScript 进行 JSON 解析、字符串操作以及各种辅助函数,而使用 VBScript 处理主要业务逻辑。
这种混合方法在所有先前的 Windows/IIS 版本上都能完美运行。

我尝试过的解决方案:
通过社区论坛,我发现启用 IIS 中的"在 MTA 中执行"(COM+属性 > ASP > "在 MTA 中执行" = True)似乎可以暂时避免崩溃。
这确实似乎阻止了立即崩溃,但引入了其他副作用,包括会话/线程安全问题以及与某些遗留 COM 对象的不稳定性。
由于项目复杂性和规模,禁用 JScript 或重写所有 JScript 为 VBScript 并不可行。
 楼主| xuanxiao 发表于 3 天前 | 显示全部楼层
主要观察结果:

这看起来像是 Windows 11 中的一个回归或破坏性变更,因为完全相同的代码库在所有更早的 Windows 10 和 Windows Server 2019/2022 版本上都能完美运行。

混合 VBScript 和 JScript 的经典 ASP 现在从根本上变得不稳定:JScript 代码不再能够在 VBScript 页面中可靠地执行。

许多开源 JSON 解决方案和高级 Classic ASP 模块都依赖这种混合脚本模型。

看起来底层脚本引擎已经改变,资源管理(IActiveScript::SetScriptState / ReuseEngine)在两个引擎都加载时现在会失败。

有谁知道微软针对此问题是否有永久解决方法或补丁?

有没有办法在 Classic ASP 中继续同时使用 JScript 和 VBScript,或者这是在当前 Windows 版本中已经走投无路的情况?

微软是否已将此问题确认为错误,或表明将发布修复程序?

为何这很重要:

有数千个关键业务、长期运行的 Classic ASP 应用依赖于这种脚本组合(尤其是用于 JSON 解析)。
在未发出警告或提供迁移工具的情况下破坏这种兼容性,对短期内无法重写整个应用程序的公司来说是一个重大障碍。
"在 MTA 中执行"是一个危险的临时解决方案,因为它会在从未设计为多线程执行的应用程序中引入潜在的并发和状态问题。
我尝试卸载了 KB5054979 和 KB5058499 两个更新(如更新历史中所示),但这并没有解决问题。之前,我能够使用 2025-06-01 的系统还原点来回滚更改,但现在我甚至找不到系统还原界面了。
 楼主| xuanxiao 发表于 3 天前 | 显示全部楼层
以下是解决方案:
确认这个思路在 Win11和Windows Server 2025上同样有效。

     我们发现,由于 Windows 11 的 24H2 更新,jscript9legacy.dll 被使用而不是 jscript.dll(参考文章:Script errors in Working Papers Caseview - Windows 24H2 Update)。根据 Caseview 的说明,“Windows 11 24H2 和 25H2 更新已经开始设置一个本地策略,默认情况下导致应用程序使用 JScript9Legacy.dll 而不是 JScript.dll。”。
微信图片_20251105140119_7035_186.png

要使用 jscript.dll 而不是 jscript9legacy.dll,我们有两种方法:
1.通过.reg 文件生成注册表键值

打开记事本

插入以下文本:
  1. Windows Registry Editor Version 5.00

  2. [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main]

  3. "JScriptReplacement"=dword:00000000
复制代码

保存为 .REG 文件。
通过双击执行文件。导入注册表

2.通过注册表编辑器手动生成注册表键值。
启动 regedit。

导航至:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\Main(可能需要创建 Internet Explorer 和 Main 键)

右键点击 Main 键,选择新建 | DWORD (32 位) 值。

将新值命名为 JScriptReplacement。

将 JScriptReplacement 的值设置为 0。

用户可以直接修改注册表键,位置为 HKEY_LOCAL_MACHINE(如上所示)或 HKEY_CURRENT_USER。

现在当我们调用服务器端 JavaScript 函数时,它不再产生错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表

在线客服

售前咨询
售后咨询
服务热线
023-58418553
微信公众号