事前設定
スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行
有効にする
if (navigator.appName == "Microsoft Internet Explorer") {
//
}
WScript.Shell
レジストリ
<script>
var wScriptShell = new ActiveXObject("WScript.Shell");
var key = "HKCU\\Software\\Test\\data1"
try {
// レジストリを取得する
document.write(wScriptShell.RegRead(key));
// 書き込み
// 32bit符号なし整数値
wScriptShell.RegWrite(key, 1, "REG_DWORD");
// 改行を含まない 固定長の文字列
wScriptShell.RegWrite(key, "にほんごとか", "REG_SZ");
// レジストリを削除する
wScriptShell.RegDelete(key);
} catch(e) {
// 出力例)
// Error: レジストリ キー "HKCU\\Software\\Test\\" のルートが無効です。
// Error: レジストリ キー "HKCU\\Software\\Test\\data1" を開いて読み取ることができません。
alert(e);
}
</script>
メモ帳
index.html
<script>
var wScriptShell = new ActiveXObject("WScript.Shell");
var wshSysEnv = wScriptShell.Exec("notepad.exe");
</script>
ページにアクセスするとActiveXによりメモ帳が開かれる。
ローカルのIPアドレスを取得 (ipconfig) DOS窓表示
参考: JavaScriptでのIPアドレスを取得 - JavaScript~PG CENTER(プログラムセンター)~
<script>
var wScriptShell = new ActiveXObject("WScript.Shell");
// ローカルIPアドレスを取得
var wshSysEnv = wScriptShell.Exec("ipconfig.exe");
// 標準出力からIPを抽出
while ( !wshSysEnv.StdOut.AtEndOfStream ) {
strLine = wshSysEnv.StdOut.ReadLine();
// WinXP
iIP = strLine.indexOf("IP Address");
// 取得失敗は-1になる
if ( iIP < 0 ) {
// Win10
iIP = strLine.indexOf("IPv4 アドレス");
}
// 取得成功の時
if ( iIP >= 0 ) {
iColon = strLine.indexOf( ":" );
strAddress = strLine.substr( iColon + 2 );
strAddress = strAddress.substr( 0, strAddress.length - 1 );
// 結果
alert(strAddress);
}
}
</script>
DOS窓 非表示
<script>
var wsh = new ActiveXObject("WScript.Shell");
var tmpfile = '%temp%\\tmp.txt';
var command = "cmd /c ipconfig.exe > " + tmpfile;
// 0: 非表示
wsh.Run(command,0);
</script>
キー入力
<script>
var wScriptShell = new ActiveXObject("WScript.Shell");
// control と Esc同時押し
wScriptShell.SendKeys("^{ESC}")
フォルダ表示
var wsh = new ActiveXObject("WScript.shell");
var fileProtocolHandler = "rundll32.exe url.dll,FileProtocolHandler ";
var path = "C:\\";
wsh.run(fileProtocolHandler + path);
カレントディレクトリを指定
var wsh = new ActiveXObject("WScript.Shell");
wsh.CurrentDirectory = "C:\\aaa\\bbb"
wsh.Run("sample.vbs");
Scripting.FileSystemObject
ファイル操作
書き込み
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (!fso.FolderExists("C:\\src")) {
var fol = fso.CreateFolder("C:\\src");
}
var fil = fso.CreateTextFile("c:\\src\\output.txt");
fil.WriteLine("てすと");
fil.close();
document.write("C:\\src\\output.txt にファイルが作成されました。");
読み込み
var fso = new ActiveXObject("Scripting.FileSystemObject");
var filename = "c:\\src\\output.txt";
// 存在確認
if (! fso.FileExists(filename)) {
return false;
}
var objFile = fso.GetFile(filename);
// ファイルサイズ
if (1000 < objFile.Size) {
return false;
}
// 読み込み
var txt = fso.OpenTextFile(filename, 1, false, 0);
// 内容の取得
var content = txt.ReadAll();
txt.Close();
document.write(content);
%temp%のPATH
var fso = new ActiveXObject("Scripting.FileSystemObject");
// %temp%のフルパスを取得
var objFolder = fso.getSpecialFolder(2);
alert(objFolder.Path);
vbsのソースを記述し実行
// プログラムを生成
var fso = new ActiveXObject("Scripting.FileSystemObject");
var objFolder = fso.getSpecialFolder(2); // %temp%のフルパスを取得
var fil = fso.CreateTextFile(objFolder.Path + "\\a.vbs");
var src = 'WScript.sleep(1000) \n msgbox "あああ" ';
fil.WriteLine(src);
fil.close();
// プログラムを実行
var wsh = new ActiveXObject("WScript.Shell");
wsh.Run(objFolder.Path + "\\a.vbs");
WScript.Network
<script>
var objNetWork = new ActiveXObject("WScript.Network");
document.write("コンピュータ名" + objNetWork.ComputerName);
document.write("ユーザ名" + objNetWork.UserName);
</script>
GetObjectについて
GetObjectはIE9から利用できなくなった。
- GetObject - JavaScript | MDN
- internet explorer - Code Sign Javascript to use 'new ActiveXObject()' / 'GetObject()' - Stack Overflow
Excel.Application
Excel起動
var oXL = new ActiveXObject("Excel.Application");
oXL.Visible = true;
その他、ActiveXから外れるが雑記
IEのjavascriptで window.external
- window.external javascript。IE専用
クライアント証明書が入っているか確認
- Certificate Store Migration - Windows applications | Microsoft Docs
- MY
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\My\Certificates
-
certmgr.msc
コマンド PS Cert:\> dir Cert:\CurrentUser\My