IEでActiveXを実行

## 事前設定

> スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行

有効にする

```js
if (navigator.appName == "Microsoft Internet Explorer") {
    //
}
```

## WScript.Shell


### レジストリ

* [【WSH サンプル集】レジストリを操作する - WSH@Workshop](http://wsh.style-mods.net/tips/wshtips_6-02.htm)
* [Windows 10のレジストリ設定の基本 | Think IT（シンクイット）](https://thinkit.co.jp/story/2015/06/30/6147)


```js
<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>
```

![data1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/2c42e08a-9417-559f-fb42-888a204b7880.png)
![data2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e335c9df-5a5b-aba1-d18d-08aa66c5e259.png)



### メモ帳

```html: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（プログラムセンター）～](http://pgcenter.web.fc2.com/contents/javascript_getip.html)

```html
<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窓 非表示

```html
<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>
```


### キー入力

```html
<script>
var wScriptShell = new ActiveXObject("WScript.Shell");
// control と Esc同時押し
wScriptShell.SendKeys("^{ESC}")
```

### フォルダ表示

```js
var wsh = new ActiveXObject("WScript.shell");
var fileProtocolHandler = "rundll32.exe url.dll,FileProtocolHandler ";
var path = "C:\\";
wsh.run(fileProtocolHandler + path);
```

### カレントディレクトリを指定

```js
var wsh = new ActiveXObject("WScript.Shell");
wsh.CurrentDirectory = "C:\\aaa\\bbb"
wsh.Run("sample.vbs");
```

----

## Scripting.FileSystemObject

### ファイル操作

```js:書き込み
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 にファイルが作成されました。");
```


```js:読み込み
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

```js
var fso = new ActiveXObject("Scripting.FileSystemObject");
// %temp%のフルパスを取得
var objFolder = fso.getSpecialFolder(2);
alert(objFolder.Path);
```

### vbsのソースを記述し実行

```js
// プログラムを生成
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

* [(JavaScript,ActiveX)WSHを使ってコンピュータ名とWindowsユーザ名を取得する : old_3流プログラマのメモ書き](https://jehupc.exblog.jp/19188756/)

```html
<script>
var objNetWork = new ActiveXObject("WScript.Network");
document.write("コンピュータ名" + objNetWork.ComputerName);
document.write("ユーザ名" + objNetWork.UserName);
</script>
```

----

## GetObjectについて

GetObjectはIE9から利用できなくなった。

* [GetObject - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Microsoft_Extensions/GetObject)
* [internet explorer - Code Sign Javascript to use 'new ActiveXObject()' / 'GetObject()' - Stack Overflow](https://stackoverflow.com/questions/5463180/code-sign-javascript-to-use-new-activexobject-getobject)

----

## Excel.Application

### Excel起動

```js
var oXL = new ActiveXObject("Excel.Application");
oXL.Visible = true;
```

----

その他、ActiveXから外れるが雑記

### IEのjavascriptで window.external

* [window.external](https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms535246%28v%3dvs.85%29) javascript。IE専用

### クライアント証明書が入っているか確認

* [Certificate Store Migration - Windows applications | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/win32/seccrypto/certificate-store-migration)
* MY
    * `%APPDATA%\Microsoft\SystemCertificates\My\Certificates\`
    * `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\My\Certificates`
* `certmgr.msc`コマンド
* `PS Cert:\> dir Cert:\CurrentUser\My`