プログラミング

WSHでWin32APIを呼び出す

2005年6月25日

 先の記事を書いた後、WSHでWin32APIを呼び出す方法について調べてみた。DynaCallもしくはDynaWrapというツールを提供してくれている人がいる(The DynaCall page)。これを使えば、VBscriptからWin32APIを呼び出せそうである。

 ちなみに、このページ(The DynaCall page)からdynawrapNt.zipをダウンロードできるようになっている。

 Windows-NT用であるが、今使っているWindows-2000でも使えるかどうか試してみた。

 ダウンロード後、DynaCall のページに従って、

RegSvr32.exe C:\winnt\system32\dynwrap.dll

で、dll を登録した。次に、付属のMsgBoc.vbsを実行してみた。このスクリプトの実行部分は以下の通り:

Dim UserWrap
Set UserWrap = CreateObject("DynamicWrapper")
UserWrap.Register "USER32.DLL", "MessageBoxA", "I=HsSu", _
"f=s", "R=l"
UserWrap.MessageBoxA Null, "MessageBox (ANSI)", _
"From DynaWrap Object", 3

DynaWrap

うまくいった。これは色々使えそうである。

 さらに、DynaWrapがインストールされている際のセキュリティーについて調べてみた。上記のVBscriptをHTMLに埋め込み、ブラウザでこのHTMLを開いたところ、CreateObjectの際に次のような警告を受けた。

DynaWrap test2

注意して使っていれば、セキュリティー上の問題もクリアできるということだけども、あまり安全ではないのかもしれない。

 DynaWrapがレジストされている場合とされていない場合でのセキュリティーの違いを比較するため、次の様な二つのHTMLを作成し、サーバに置いた後、アクセスしてみた。

**********test.htm**********
<HTML><BODY><script language=VBscript>
Option Explicit
Dim UserWrap
Set UserWrap = CreateObject("DynamicWrapper")
UserWrap.Register "kernel32.dll", "WinExec", "I=sl", "f=s", "R=l"
UserWrap.WinExec "notepad.exe", 5
</script></BODY></HTML>

**********test2.htm**********
<HTML><BODY><script language=VBscript>
Option Explicit
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.run "notepad.exe",1,true
</script></BODY></HTML>

結果は2つとも同じ、つまり同じ警告画面(上記のものと同じ)が表示され、『はい』を押した時だけノートパッドが起動された。以上のことから、DynaWrapがレジストされていてもセキュリティー上の危険度は変わらない(だろう)ということが分かった。

(続く)

コメント

Kat (2010年2月14日 19:45:28)

プラグインインストール時のバグを解消したSVNリビジョン138にアップグレードしました。

カネダ (2009年10月4日 22:52:05)

お疲れ様です。
wshは余り使っていませんでしたが、以下のことができるようであれば使う必要が出てきそうなのでお問合せします。

The Dynacall PageはWindows2000でなくWindowsXP上でも、VBscriptからWin32APIを呼び出せるでしょうか?

Kat (2009年10月6日 18:09:23)

DynaWrapを用いると、VBScriptからWin32APIが呼び出すことができます。ただ、XPで使えるかどうかは、試したことがないので知りません。

拙作のSFC miniでは、XPでも動くことが確認されています。DynaWrapでできることは一通り(たぶん、すべて)できますし、DynaWrapでは用いることのできない、構造体を介したAPIの呼び出しなども行えます。

http://www.recfor.net/sfcmini/

よろしければ、使ってみてください。

コメント送信