この記事を書いている2025年2月2日時点での話です。
なお筆者の Windows のバージョンは Windows10 Pro 22H2 19045.5371 です。
初報 2025年2月2日(日)
Windows では WSH(Windows Script Host)と呼ばれるスクリプト実行環境が Windows98 の頃から用意されており,標準では JavaScript と VBScript を使用できます1。ただし,VBScript は2027年にデフォルトで無効になるとのこと2。幸いなことに JavaScript のほうはもうしばらく使えそうですが,そもそもエンジンが IE6 時代のものなので言語仕様が相当古いのです。幸いなことに IE9 以降の JavaScript エンジン(JScript9)や Edge の JavaScript エンジン(Chakra)に置き換える方法も知られています3。
具体的には下記のように CLSID を直接指定することにより,JavaScript エンジンを置き換えることができます。
cscript //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} script.js
cscript //E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} script.js
ところが,このうち Chakra エンジンを使用しようとすると下記のエラーメッセージが表示されるようになったのです。
CScript エラー: Chakra スクリプト エンジンの実行は、Windows Script Host に対してブロックされています。
管理者権限で実行してもダメでした。
なお,JScript9 エンジンのほうは引き続き使用することができます。
本件に関して,マイクロソフトの月例セキュリティ更新情報4などを見てみましたが,それらしい情報は得られませんでした。
次報 2025年2月3日(月)
あれれ?何故か会社の PC だと Chakra エンジンが使えます。これは貴重な情報です。タイムスタンプを確認してみましょう。
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
が怪しいように思います。
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年になって当たったアップデートはありません。
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日にセキュリティアップデートが行われています。
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 関連とみられる更新が行われています。
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 ファイルは必ずしもそこに実体があるとは限らないようです。本体はコンポーネントストアに格納されており,システムフォルダからハードリンクが貼られているようなのです。それでは実際に調べてみましょう。
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 の実行ファイルが置いてあります。
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 の実行ファイルと同じです。
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
ということで,この前バージョンの実行ファイルを直接実行させたらどうなるでしょう?実際に確かめてみると,無事動きました。ヘルプメッセージが英語なのは,リソースファイルか何かのリンクが切れているからではないかと思います。
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 プログラムを以下に示します。
//------------------------------------------------------------------------------
// 素数チェックおよび素因数分解を行います。
//------------------------------------------------------------------------------
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 を素因数に持ちます。
-
WSH JScript Chakra を使用した ES2015(ES6) 対応(スクリプトエンジンまとめ) - HatenaBlog ↩
-
PowerShell / Microsoft.PowerShell.Management / Get-HotFix - learn.microsoft.com ↩
-
2025年1月14日 - KB5049981 (OS ビルド 19044.5371 および 19045.5371) - support.microsoft.com ↩
-
2025年1月14日 - KB5049981 (OS ビルド 19044.5371 および 19045.5371) - support.microsoft.com ↩
-
「C:\Windows\WinSxS」(コンポーネントストア)は絶対に触れてはいけないWindowsの“聖域” - @ITmedia ↩