2016年9月5日月曜日

タスクマネージャでhtaの実行ファイルの名前を分かりやすくする

HTAアプリを多用していると、プロセスの一覧が以下のように「mshta.exe」だらけになってしまうことがあります。どのプロセスがどのアプリなのか判別しやすくなるようにするプログラムを作成しました。


以下のプログラムを使うと、以下のように名前が分かりやすくなります。




<html>
<head>
<title>mshta_アプリ名</title>
</head>
<body>
</body>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('WScript.Shell')
gsf2 = fs.GetSpecialFolder(2)
getPID=function(){
// 自身のプロセスIDを返す。
// 子プロセスを作ってそのPIDを取得するために
// まずはプロセス起動用のオブジェクトを用意する。
shell = new ActiveXObject('WScript.Shell')
// 子プロセスをcscriptにすると黒い画面が一瞬表示されてしまう。
// 「//B」オプションを付けないとwscriptの設定画面が表示されてしまう。
var childPID = shell.Exec('wscript //B').ProcessID
// 子の親(自身)のPIDを特定する
var res = getWin32process(childPID)
return res.atEnd() ? (void 0) : res.item().ParentProcessID
}
getWin32process=function(PID){ return new Enumerator(GetObject("winmgmts:root\\CIMV2").ExecQuery("SELECT * FROM Win32_Process where ProcessID="+PID)) }
// 起動後初回はなぜか必ず取得に失敗するので、最初に一度実行しておく。
getPID()
onload = function(){
// 他のhtaと判別しやすいようにプロセス名は「mshta_アプリ名.exe」にしたい。
// プロセス名がデフォルトの「mshta.exe」になっている場合は「mshta_アプリ名.exe」になるように再起動する。
var cmdLine=getWin32process(getPID()).item().commandLine, 実行ファイルPath=cmdLine.match(/^"([^"]+)"/)[1], exePath=gsf2+'/mshta_アプリ名.exe'
実行ファイルPath = 実行ファイルPath.replace(/\\/g,'/')
exePath = exePath .replace(/\\/g,'/')
if(実行ファイルPath != exePath){
!fs.FileExists(exePath) && fs.CopyFile(実行ファイルPath, exePath)
shell.run(exePath+' '+document.location.href) // location.pathnameだとUNCパスの場合「\\PC名\共有フォルダ\name.hta」となるべき場合「\共有フォルダ\name.hta」となってしまい、使えない。
window.close()
}
onbeforeunload = function(){ try{fs.DeleteFile(exePath)}catch(e){} }
}
</script>
</html>

0 件のコメント:

コメントを投稿