IE9 的 Javascript 引擎的 ProgId 或 CLSID 是什么(代号为“Chakra”)

IT技术 javascript .net wsh chakra iactivescript
2021-02-24 12:10:05

使用 .NET,我可以编写一个应用程序来承载符合 Microsoft 的 IActiveScript 约定的脚本引擎。这包括来自 Microsoft 的 JScript 和 VBScript,以及来自第三方的PerlScript、RubyScript,我不知道还有什么

在代码中这样做的方法是这样的:

    Type engine = Type.GetTypeFromProgID(progId, true);
    _engine = Activator.CreateInstance(engine) as IActiveScript;

其中progId可以取值 Javascript、JScript、ECMAScript、VBScript 等。您可以在运行 cscript.exe 时执行类似的操作,在命令行上使用//E选项指定 progId 例如,这个命令:

cscript.exe  <file>  //e:JScript

.. 将通过 JScript 引擎运行指定的文件,无论其扩展名如何。

在我的机器上,如果我查看HKLM\SW\Classes\,三个 progIds {Javascript, JScript, ECMAScript} 都指向同一个 CLSID,我猜这就是 JScript 5.8 脚本引擎:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

是否可以指定 ProgId 或 CLSID 来运行 IE9 的 Javascript 引擎,又名“Chakra”?

IE9 的引擎是否仍然被 IActiveScript 加载?
Microsoft 的文档表明它可以,但没有指定 ProgId 或 CLSID。

3个回答

与 IE9 一起安装的 Chakra Javascript 引擎的 CLSID 是
{16d51579-a30b-4c8b-a276-0ff4dc41e755}.

InProcServer32 是%windir%\System32\jscript9.dll .

没有我能找到的 ProgId。这有点奇怪;通常成对的 ProgId 和 CLSID 条目相互引用。对于给定的 COM 对象,注册表中的 ProgId 键有一个叫做 CLSID 的子键,CLSID 注册表键有一个叫做 ProgId 的子键,它们相互引用。但是 IE9 CLSID 的 ProgId 子项是“JScript”,当然是指 v5.8 Jscript CLSID。不确定这是微软的错误,还是有意的混淆,因为他们不希望任何人在 IE9 之外使用 Chakra 引擎。在我看来是有目的的。


我只是通过在注册表中搜索 jscript9.dll 来了解 CLSID。


如果您有托管脚本引擎的 .NET 代码,则可以直接使用 CLSID 为 IE9 javascript 引擎(“Chakra”)实例化 IActiveScript 对象。代码需要是这样的:

private const string clsIdPattern =
    @"^(?<curly>\{)?[a-zA-Z0-9]{8}(?:-[a-zA-Z0-9]{4}){3}-[a-zA-Z0-9]{12}(?(curly)\})$";

public ScriptEngine(string language)
{
    if (language == null)
        throw new ArgumentNullException("language");

    Type engineType = null;

    if (Regex.IsMatch(language, clsIdPattern))
    {
        // it's a CLSID
        var guid = new System.Guid(language);
        engineType = Type.GetTypeFromCLSID(guid, true);
    }
    else
    {
        // assume vanilla progId
        engineType = Type.GetTypeFromProgID(language, true);
    }

    var engine = Activator.CreateInstance(engineType) as IActiveScript;

在上面,clsIdPattern是一个匹配熟悉的 GUID 格式的正则表达式,有或没有环绕的curl。

给定上面的代码,您可以传递“jscript”、“Javascript”或“ECMAScript”并获得 v5.8 JScript 引擎。或者你可以通过“{16d51579-a30b-4c8b-a276-0ff4dc41e755}”并获得IE9 Javascript引擎。显然,您需要安装 IE9 才能使其正常工作。

我刚试过这个,它适用于简单的情况。我会再玩一段时间,真的很快。


如果你想从 WSH 运行 Chakra,比如从 cscript.exe,那么你将需要一个 ProgId,我想。
如果我在注册表中创建“Chakra”作为 Progid,引用正确的 CLSID,我可以通过 IE9 的引擎运行 JS 文件,如下所示:

cscript.exe  module.js  //E:Chakra 

例如,在插入新的“Chakra”ProgId 后,给出这样的脚本:

WScript.Echo( ScriptEngineMajorVersion() + "." +
              ScriptEngineMinorVersion() + "." +
              ScriptEngineBuildVersion());

...输出是这样的:

C:\dev\js>Version.js
5.8.16982

C:\dev\js>cscript.exe Version.js  //E:Chakra
9.0.16434

这是在 Javascript 中测试 AES 加密的结果,将 Chakra 与 JScript 5.8 进行比较:

C:\dev\js\SlowAES>cscript.exe test.aes.js
AES encryption in Javascript.
password  : Albatros1
salt      : saltines (73616c74696e6573)
iterations: 1000
key       : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66
iv        : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248
plaintext : Hello, /r/javascript.
ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182
decrypted : Hello, /r/javascript.
elapsed   : 5011ms

C:\dev\js\SlowAES>cscript.exe test.aes.js //E:Chakra
AES encryption in Javascript.
password  : Albatros1
salt      : saltines (73616c74696e6573)
iterations: 1000
key       : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66
iv        : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248
plaintext : Hello, /r/javascript.
ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182
decrypted : Hello, /r/javascript.
elapsed   : 2593ms

为了在我的注册表中设置 ProgId,我使用了这个:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="Chakra"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="Chakra"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra]
@="JScript Language"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\CLSID]
@="{16d51579-a30b-4c8b-a276-0ff4dc41e755}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\OLEScript]

为了不暴露 Chakra 或恢复注册表,我这样做了:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="JScript"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="JScript"

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra]

此注册表脚本适用于 x64 Windows;如果您没有 x64,则需要删除 WOW6432Node 行。

您在上述评论中的链接似乎已失效。由于我目前正在尝试使活动脚本分析器正常工作,因此我很想看看您的示例,希望能给我一些启发。仍然可以以某种方式下载您的示例吗?
2021-05-06 12:10:05
另请参阅cheeso.members.winisp.net/...,了解使用 Chakra 从 C# 应用程序中运行 Javascript 的示例。
2021-05-16 12:10:05

可能有点晚了,但是:

您还可以通过 //E 参数简单地指定要使用的引擎的 CLSID:

cscript.exe <文件> //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755}

编辑:根据 Cheeso 的回答,我发现添加以下注册表项就足以在不指定 CLSID 的情况下使用 jscript9。这里使用的键名是JScript9如果你愿意,可以用Chakra替换它键名是您在 //E: 之后指定的内容,然后:

Windows 注册表编辑器 5.00 版

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9]
@="JScript9 语言"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\CLSID]
@="{16d51579-a30b-4c8b-a276-0ff4dc41e755}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\OLEScript]

接着:

cscript.exe <文件> //E:JScript9

您现在可以通过已发布的 API 直接调用 Chakra 运行时,而不必再使用IActiveScript

这是 MSDN 上的一篇文章,展示了如何在 C++ 或 C# 中托管 Chakra 运行时:

https://web.archive.org/web/20151103122111/https://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

注意:截至 2019 年,代码示例位于github.com/microsoft/Chakra-Samples 上

优秀的!谢谢,贾斯汀。
2021-04-20 12:10:05