1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【速報】ある日突然WSHでChakraエンジンが使えなくなった

Last updated at Posted at 2025-02-02

この記事を書いている2025年2月2日時点での話です。
なお筆者の Windows のバージョンは Windows10 Pro 22H2 19045.5371 です。

初報 2025年2月2日(日)

Windows では WSH(Windows Script Host)と呼ばれるスクリプト実行環境が Windows98 の頃から用意されており,標準では JavaScriptVBScript を使用できます1。ただし,VBScript は2027年にデフォルトで無効になるとのこと2。幸いなことに JavaScript のほうはもうしばらく使えそうですが,そもそもエンジンが IE6 時代のものなので言語仕様が相当古いのです。幸いなことに IE9 以降の JavaScript エンジン(JScript9)や EdgeJavaScript エンジン(Chakra)に置き換える方法も知られています3

具体的には下記のように CLSID を直接指定することにより,JavaScript エンジンを置き換えることができます。

JScript9 を使う方法
cscript //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} script.js
Chakraエンジンを使う方法
cscript //E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} script.js

ところが,このうち Chakra エンジンを使用しようとすると下記のエラーメッセージが表示されるようになったのです。

CScript エラー: Chakra スクリプト エンジンの実行は、Windows Script Host に対してブロックされています。

管理者権限で実行してもダメでした。

なお,JScript9 エンジンのほうは引き続き使用することができます。

本件に関して,マイクロソフトの月例セキュリティ更新情報4などを見てみましたが,それらしい情報は得られませんでした。

次報 2025年2月3日(月)

あれれ?何故か会社の PC だと Chakra エンジンが使えます。これは貴重な情報です。タイムスタンプを確認してみましょう。

会社の PC(Windows10 22H2 19045.5247)の場合
c:\>dir c:\windows\system32\chakra.* c:\windows\system32\?script.exe
~中略~
2024/08/21  11:26         7,770,112 Chakra.dll
2024/11/15  10:06           173,056 cscript.exe
2024/11/15  10:06           180,736 wscript.exe

一方,自宅の PC は以下のようになっています。おそらく Chakra.dll のほうはバイナリが同じで,2025年1月16日に更新された cscript.exe および wscript.exe が怪しいように思います。

自宅の PC(Windows10 22H2 19045.5371)の場合
c:\>dir c:\windows\system32\chakra.* c:\windows\system32\?script.exe
~中略~
2024/08/11  04:34         7,770,112 Chakra.dll
2025/01/16  18:26           188,928 cscript.exe
2025/01/16  18:26           197,120 wscript.exe

Windows Update の履歴も調べてみましょう5。会社の PC は2025年になって当たったアップデートはありません。

会社の PC(Windows10 22H2 19045.5247)の場合
PS C:\> get-hotfix | sort-object -property InstalledOn | format-table -autosize
Source   Description     HotFixID  InstalledBy          InstalledOn
------   -----------     --------  -----------          -----------
~中略~
xxxxxx   Update          KB5043130 NT AUTHORITY\SYSTEM  2024/10/11 0:00:00
xxxxxx   Update          KB5044020 NT AUTHORITY\SYSTEM  2024/10/11 0:00:00
xxxxxx   Update          KB5046823 NT AUTHORITY\SYSTEM  2024/11/15 0:00:00
xxxxxx   Security Update KB5048652 NT AUTHORITY\SYSTEM  2024/12/16 0:00:00

一方,自宅の PC はちょうど2025年1月16日にセキュリティアップデートが行われています。

自宅の PC(Windows10 22H2 19045.5371)の場合
PS C:\> get-hotfix | sort-object -property InstalledOn | format-table -autosize
Source   Description     HotFixID  InstalledBy         InstalledOn
------   -----------     --------  -----------         -----------
~中略~
yyyyyy   Update          KB5043130 NT AUTHORITY\SYSTEM 2024/10/11 0:00:00
yyyyyy   Update          KB5046823 NT AUTHORITY\SYSTEM 2024/11/15 0:00:00
yyyyyy   Security Update KB5049981 NT AUTHORITY\SYSTEM 2025/01/16 0:00:00
yyyyyy   Security Update KB5050388 NT AUTHORITY\SYSTEM 2025/01/16 0:00:00
yyyyyy   Update          KB5049621 NT AUTHORITY\SYSTEM 2025/01/18 0:00:00

しかしながら,サポート情報67を見ても何が変更されたのかさっぱり分かりません。

第三報 2025年2月4日(火)

Windows には C:\Windows\WinSxS というフォルダがありますが,そこはコンポーネントストアとも呼ばれ,Windows の機能や更新プログラムのインストール/アンインストール等に関係するファイルの格納場所となっています。

ここを調べると2025年1月16日Windows Scripting Host 関連とみられる更新が行われています。

自宅の PC(Windows10 22H2 19045.5371)の場合
c:\>dir /od c:\windows\WinSxS | findstr microsoft-windows-scripting
~中略~
2024/11/15 20:03  <DIR>  amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731
2024/11/15 20:03  <DIR>  wow64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_c799d3c7e9da792c
2025/01/16 18:26  <DIR>  amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5369_none_bd2319efb593a514
2025/01/16 18:26  <DIR>  wow64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5369_none_c777c441e9f4670f
2025/01/16 18:26  <DIR>  amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.5369_en-us_ffe767e90cad5a35
2025/01/16 18:26  <DIR>  amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.5369_ja-jp_2eb7b01fc9f35995

第四報 2025年2月5日(水)

参考文献8によると,システムフォルダ C:\Windows\System32 に置いてある EXE ファイルや DLL ファイルは必ずしもそこに実体があるとは限らないようです。本体はコンポーネントストアに格納されており,システムフォルダからハードリンクが貼られているようなのです。それでは実際に調べてみましょう。

自宅の PC(Windows10 22H2 19045.5371)の場合
c:\>fsutil hardlink list c:\windows\system32\cscript.exe
\Windows\WinSxS\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5369_none_bd2319efb593a514\cscript.exe
\Windows\System32\cscript.exe

確かにコンポーネントストアに最新の Windows Script Host の実行ファイルが置いてあります。

自宅の PC(Windows10 22H2 19045.5371)の場合
c:\>dir c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5369_none_bd2319efb593a514
~中略~
2025/01/16  18:26           188,928 cscript.exe
2025/01/16  18:26           197,120 wscript.exe

コンポーネントストアの別のフォルダにはアップデートされる前の実行ファイルも無事保管されていることが分かりました。ファイルサイズが会社の PC の実行ファイルと同じです。

自宅の PC(Windows10 22H2 19045.5371)の場合
c:\>dir c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731
~中略~
2024/11/15  20:02           173,056 cscript.exe
2024/11/15  20:02           180,736 wscript.exe

ということで,この前バージョンの実行ファイルを直接実行させたらどうなるでしょう?実際に確かめてみると,無事動きました。ヘルプメッセージが英語なのは,リソースファイルか何かのリンクが切れているからではないかと思います。

自宅の PC(Windows10 22H2 19045.5371)の場合
c:\>c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\cscript.exe
Usage: CScript scriptname.extension [option...] [arguments...]

Options:
 //B         Batch mode: Suppresses script errors and prompts from displaying
 //D         Enable Active Debugging
 //E:engine  Use engine for executing script
 //H:CScript Changes the default script host to CScript.exe
 //H:WScript Changes the default script host to WScript.exe (default)
 //I         Interactive mode (default, opposite of //B)
 //Job:xxxx  Execute a WSF job
 //Logo      Display logo (default)
 //Nologo    Prevent logo display: No banner will be shown at execution time
 //S         Save current command line options for this user
 //T:nn      Time out in seconds:  Maximum time a script is permitted to run
 //X         Execute script in debugger
 //U         Use Unicode for redirected I/O from the console

//E:engine オプションで Chakra エンジンを指定しても無事動きました。

C:\Qiita>c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\cscript.exe
 //E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} CHECKPRIME.JS
素数のチェック,合成数の場合は素因数分解を行います。

CHECKPRIME(.JS) [整数]

素数なら 0,合成数なら 1 を返します。

ちなみにサンプルの JavaScript プログラムを以下に示します。

CHECKPRIME.JS
//------------------------------------------------------------------------------
// 素数チェックおよび素因数分解を行います。
//------------------------------------------------------------------------------
function main(args) {
	if(args.Count == 0) {
		WScript.Echo("素数のチェック,合成数の場合は素因数分解を行います。");
		WScript.Echo("");
		WScript.Echo("CHECKPRIME(.JS) [整数]");
		WScript.Echo("");
		WScript.Echo("素数なら 0,合成数なら 1 を返します。");
		return -1;
	}
	var	n = parseInt(args(0));
	if(n < 2) {
		WScript.Echo("2 以上の整数を入力して下さい!!");
		return -1;
	}
	var	a = [];
	for(var p = n, q = 2; q * q <= p; q++) {
		while(p % q == 0) {
			p /= q;
			a.push(q);
		}
	}
	if(p > 1) a.push(p);
	if(a.length == 1) {
		WScript.Echo("整数 " + n + " は素数です。");
		return 0;
	} else {
		WScript.Echo("整数 " + n + " は合成数です。");
		WScript.Echo(a.join(",") + " を素因数に持ちます。");
		return 1;
	}
}
var	ret = main(WScript.Arguments.Unnamed);
try {
	WScript.Quit(ret);
} catch(e) {
	/* 何もしない */
}

第五報 2025年2月6日(木)

ヘルプメッセージが英文になってしまう問題について,ちょっとした実験をしてみました。通常,システムフォルダ c:\windows\system32 にはパスが通っているので,下記のコマンドはシステムフォルダの cscript.exe を実行していることになりますが,ヘルプメッセージは日本語で表示されます。

c:\Qiita>cscript
使い方 : CScript scriptname.extension [オプション...] [引数...]

オプション :
 //B         バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする
 //D         アクティブ デバッグを使用可能にする
 //E:engine  スクリプト実行時にエンジンを使用する
 //H:CScript 既定のスクリプト ホストを CScript.exe に変更する
 //H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)
 //I         対話モード (既定値、//B と逆の動作)
 //Job:xxxx  WSF ジョブを実行する
 //Logo      ロゴを表示する (既定値)
 //Nologo    ロゴを表示しない : 実行時に見出しを表示しない
 //S         このユーザーの現在のコマンド ライン オプションを保存する
 //T:nn      秒単位のタイムアウト時間 :  スクリプトを実行できる時間の最大値
 //X         デバッガでスクリプトを実行する
 //U         コンソールからリダイレクトされた I/O に Unicode を使用する

次に作業ディレクトリ c:\Qiita>cscript.exe をコピーして実行してみると,ヘルプメッセージが英文になってしまうのです。

c:\Qiita>copy c:\windows\system32\cscript.exe .
        1 個のファイルをコピーしました。

c:\Qiita>cscript
Usage: CScript scriptname.extension [option...] [arguments...]

Options:
 //B         Batch mode: Suppresses script errors and prompts from displaying
 //D         Enable Active Debugging
 //E:engine  Use engine for executing script
 //H:CScript Changes the default script host to CScript.exe
 //H:WScript Changes the default script host to WScript.exe (default)
 //I         Interactive mode (default, opposite of //B)
 //Job:xxxx  Execute a WSF job
 //Logo      Display logo (default)
 //Nologo    Prevent logo display: No banner will be shown at execution time
 //S         Save current command line options for this user
 //T:nn      Time out in seconds:  Maximum time a script is permitted to run
 //X         Execute script in debugger
 //U         Use Unicode for redirected I/O from the console

ちなみにシステムフォルダ c:\windows\system32 にある cscript.exe のプロパティを見てみると言語は「日本語」になっています。

ところが上記のファイルをコピーしたほうは「英語」になっているのです。なぜ???

第六報 2025年2月7日(金)

マイクロソフトのサイト情報9を読んでリソースについて勉強しました。Windows Vista 以降に公開された MUI リソーステクノロジの特徴を以下に示します

  • 言語共通の実行ファイルと言語別のリソースファイルは分離される。
  • MUI リソースのファイル名は実行ファイル名の末尾に .mui が追加されたものになる。たとえば実行ファイル名 Myfile.dll とすると,MUI リソースファイル名は Myfile.dll.mui となる。
  • MUI リソースファイルは実行ファイルの置かれたフォルダのサブフォルダに置かれる。サブフォルダ名は言語に応じた名前となる。※日本語の場合は ja-jp となる。
  • リソースファイルの読み込み時にバージョン(チェックサム)を確認し,適切でない場合は読み込まれない。

ということでシステムフォルダ c:\windows\system32 のサブフォルダには確かにリソースファイルが置いてあり,コンポーネントストアへのハードリンクも貼られています。

c:\Qiita>dir /s /b c:\windows\system32 | findstr cscript
c:\windows\system32\cscript.exe
c:\windows\system32\en-US\cscript.exe.mui
c:\windows\system32\ja-jp\cscript.exe.mui

c:\Qiita>fsutil hardlink list c:\windows\system32\cscript.exe
\Windows\System32\cscript.exe
\Windows\WinSxS\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5369_none_bd2319efb593a514\cscript.exe

c:\Qiita>fsutil hardlink list c:\windows\system32\en-US\cscript.exe.mui
\Windows\WinSxS\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.5369_en-us_ffe767e90cad5a35\cscript.exe.mui
\Windows\System32\en-US\cscript.exe.mui

c:\Qiita>fsutil hardlink list c:\windows\system32\ja-jp\cscript.exe.mui
\Windows\WinSxS\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.5369_ja-jp_2eb7b01fc9f35995\cscript.exe.mui
\Windows\System32\ja-jp\cscript.exe.mui

ここで注意すべきなのは,先ほどの特徴の最後の項目です。すなわちリソースファイルにもバージョンがあるのです。

  • リソースファイルの読み込み時にバージョン(チェックサム)を確認し,適切でない場合は読み込まれない。

ということでコンポーネントストア C:\Windows\WinSxS 以下のフォルダを探すと,やはり複数のリソースファイルが存在しました。Chakra エンジンが動かなくなったセキュリティアップデートが行われたのは 2025年1月16日 ですから,日付が古いほうのフォルダのリソースファイルを使う必要があるでしょう。

c:\Windows\WinSxS>dir | findstr microsoft-windows-scripting.resources
2023/03/17 17:17  <DIR>  amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_en-us_411dae92f6d12d17
2023/03/17 17:17  <DIR>  amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77
2025/01/16 18:26  <DIR>  amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.5369_en-us_ffe767e90cad5a35
2025/01/16 18:26  <DIR>  amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.5369_ja-jp_2eb7b01fc9f35995

ということでようやく対処方法が分かりました。

現在得られている結論

コンポーネントストア C:\Windows\WinSxS 以下のどこかのフォルダにアップデートされる前の実行ファイル cscript.exe および wscript.exe が保管されているので,絶対パス指定で呼び出せば Chakra エンジンが使えます。ただし,ヘルプメッセージが英文になってしまう問題は解決できていません。

セキュリティアップデートが行われる前のスクリプトエンジンはコンポーネントストア c:\Windows\WinSxS 以下のフォルダに保管されているので,適当なフォルダ c:\Salvage を作成してそこにコピーします。

c:\>mkdir Salvage

c:\>cd Salvage

c:\Salvage>copy c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\* .
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\cscript.exe
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\dispex.dll
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\scrobj.dll
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\scrrun.dll
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\wscript.exe
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\wshcon.dll
c:\windows\winsxs\amd64_microsoft-windows-scripting_31bf3856ad364e35_10.0.19041.5072_none_bd452975b579b731\wshom.ocx
        7 個のファイルをコピーしました。

セキュリティアップデートが行われる前のスクリプトエンジンが使用していたリソースファイルもコンポーネントストア c:\Windows\WinSxS 以下のフォルダに保管されているので,サブフォルダ ja_jp を作成してをコピーします。

c:\Salvage>mkdir ja-jp

c:\Salvage>copy c:\windows\winsxs\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77\* ja-jp
c:\windows\winsxs\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77\cscript.exe.mui
c:\windows\winsxs\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77\scrobj.dll.mui
c:\windows\winsxs\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77\scrrun.dll.mui
c:\windows\winsxs\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77\wscript.exe.mui
c:\windows\winsxs\amd64_microsoft-windows-scripting.resources_31bf3856ad364e35_10.0.19041.1_ja-jp_6fedf6c9b4172c77\wshom.ocx.mui
        5 個のファイルをコピーしました。

実際に cscript.exe を実行してみると,ヘルプメッセージが日本語で表示されるようになりました。

c:\Salvage>cscript
使い方 : CScript scriptname.extension [オプション...] [引数...]

オプション :
 //B         バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする
 //D         アクティブ デバッグを使用可能にする
 //E:engine  スクリプト実行時にエンジンを使用する
 //H:CScript 既定のスクリプト ホストを CScript.exe に変更する
 //H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)
 //I         対話モード (既定値、//B と逆の動作)
 //Job:xxxx  WSF ジョブを実行する
 //Logo      ロゴを表示する (既定値)
 //Nologo    ロゴを表示しない : 実行時に見出しを表示しない
 //S         このユーザーの現在のコマンド ライン オプションを保存する
 //T:nn      秒単位のタイムアウト時間 :  スクリプトを実行できる時間の最大値
 //X         デバッガでスクリプトを実行する
 //U         コンソールからリダイレクトされた I/O に Unicode を使用する

もちろん Chakra エンジンも動作します。

c:\Salvage>cscript //E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} checkprime.js 6347156982523
整数 6347156982523 は合成数です。
7,19,47722984831 を素因数に持ちます。
  1. Windows Script Host - Wikipedia

  2. VBScriptは2027年頃にデフォルトで無効に ~非推奨化スケジュールが公開 - 窓の杜

  3. WSH JScript Chakra を使用した ES2015(ES6) 対応(スクリプトエンジンまとめ) - HatenaBlog

  4. 2025年1月のセキュリティ更新プログラム(月例) - MSRC Blog

  5. PowerShell / Microsoft.PowerShell.Management / Get-HotFix - learn.microsoft.com

  6. 2025年1月14日 - KB5049981 (OS ビルド 19044.5371 および 19045.5371) - support.microsoft.com

  7. 2025年1月14日 - KB5049981 (OS ビルド 19044.5371 および 19045.5371) - support.microsoft.com

  8. 「C:\Windows\WinSxS」(コンポーネントストア)は絶対に触れてはいけないWindowsの“聖域” - @ITmedia

  9. 国際化 / MUI リソース管理 - Win32 apps - learn.microsoft.com

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?