WSH技術情報

ここでは、WSHやVBに関する、技術情報を中心に取り上げていきます。


WSHの誕生と現状

WSHとセキュリティ

VBSのバージョンとホストプログラムのバージョンについて

PerlでWSH

VBSとVBの違い

ActiveXオブジェクトの仕様を知る方法

VBSで正規表現を使う

WSHの原理に迫る

魅惑のWSH2.0β版

スクリプトをエンコードする

Windows Script Componentsとは何か

HTA(HTMLアプリケーション)について


WSHの誕生と現状

 WSHはもともとWindowsNTのログオンスクリプトを強化する目的で誕生しました。その後、Win98でバッチファイルより高度なスクリプト環境を提供する目的で採用されました。

 しかし、WSHはまだバッチファイルには勝てません。バッチファイルよりいろいろ記述しないと駄目という点もさることながら、一番の問題点は、バッチファイルのようにファイルをドラッグアンドドロップして引数として読み込めない点でしょう。何故できないかについては話が長くなるのでやめますが、これは不便です。Windows次期バージョンではこの制限をなんとかしてほしいものです。
 …と書いたのですが、これはWSH2.0で改善されました。

 あと、ユーザーインターフェースにもっとバリエーションがほしいところです。現状で利用できるのは、結局のところメッセージボックスとインプットボックス(とコモンダイアログ)だけですから。リスト系のダイアログが使えるといいなあ。
 まあ、VBSやWSHは今でもバージョンアップが続けられているので、これからどう化けるか、じっくりと見守っていきたいと思っています。

[↑]

WSHとセキュリティ

 WSHで使われる言語(VBSなど)は本来インターネットで使われるものだけに、セキュリティに関してはかなりの配慮がなされています。たとえばVBSでいうと、本家VBにあるファイル入出力機能が省略されています。しかしこれでは本格的なスクリプトを書くには機能的に不足なので、WSHではWScriptオブジェクトとFileSystemObjectオブジェクトでその機能を補っています。これらはActiveXコントロールの一つなので、IEなどのブラウザではセキュリティ設定により実行を制限できます。逆にセキュリティ設定を甘くして、ActiveXを許可する設定にしておくと、非常にキケンです。(個人的には、ブラウザでActiveXの実行を許可している人の心境がよくわかりません。あぶないですよ。)
 また、ActiveX実行を禁止しておいても、VBSファイルへの直接リンクを実行し、WSHでスクリプトが実行されれば、ActiveXもばっちり呼び出されてしまいます。(まあこの種の危険性はVBSファイルだけに限らず、ワードなどのドキュメントファイルにも言えるのですが)。exeファイルはブラウザから直接実行できないようになっていますが、VBSファイルでは実行が可能になっているのです。十分注意しましょう。

 ここにあるスクリプトもダウンロードして解凍していきなり実行させずに、まずテキストエディタで開き、何をするスクリプトか確認してから実行するくらいの慎重さは必要だと思います。(別に変なスクリプトは書いてないつもりですが)

[↑]

VBSのバージョンとホストプログラムのバージョンについて

 VBSのランゲージリファレンスを開くと、一番上に「バージョン情報」というリンクがあります。ここをクリックしてみると、ホストアプリケーションとサポートしているVBSのバージョンが書かれた表が出てきます。これを見ているとVBSは新しいソフトが出る度に、バージョンアップしているのがわかります。たとえばIE3.0ではVBS ver.1.0が搭載されていましたが、IE4ではver.3.0が、VB6にはver.4.0、IE5.0にはver5.0という具合です。

 ところで、WSHにはどのバージョンのVBSが搭載されているのでしょうか。この表を見ると、WSH ver.1.0(Win98に付属しているバージョン)にはVBS ver.3.0が搭載されていることがわかりますが、IE5.0をインストールすると、WSHのバージョンは1.0のままですがVBSのバージョンは5.0になります。ScriptEngineMajorVersion関数、ScriptEngineMinorVersion関数、ScriptEngineBuildVersion関数を用いると、利用しているVBSのバージョンがわかります。
 VBSver.5.0では正規表現など、新しい要素が付加されているので、ぜひ最新版をインストールしておきましょう。(VBS5.0は、Windows Script5.0に含まれています。)

 ちなみに、Wscript.VersionでWSHのバージョンが取得できますが、このバージョンはwscript.exeのファイルバージョンであるので、Win98付属のものもIE5付属のものも同じ値(5.0)になります。
 WSH2.0のバージョンは5.1になります。

[↑]

PerlでWSH

 WSHでは、基本的にVBSとJScriptでコードを書くわけですが、そのほかにもPerlでも記述することができるようです。方法としては、ActiveState社がフリーで提供している、ActivePerlを使います。ActivePerlはOLE (すなわちActiveX) に対応したPerlなので、これをインストールすれば、PerlScriptでWSH用のスクリプトが記述できるようになります。私はPerlを知らないのでまだインストールしていませんが、インストールしたらまた詳しくレポートしてみたいと思います(^^;

[↑]

VBSとVBの違い

 VBSはVBスクリプトのことですが、そもそもVBとは何かについて今まで説明していませんでしたね。そこで今回は、VBを簡単に紹介して、VBSとの相違点についてふれたいと思います。

 VBとはMicrosoft Visual Basicの略で、Windows用のアプリケーションを開発するためのプログラム言語です。現在ではVer 6.0が発売されています。VBは、その名の通り、Visualな環境でプログラミングが可能で、基本的にボタンや、テキストボックス、チェックボックスといったコントロールをフォーム(ウィンドウ)に配置し、それらのコントロールに対するコードを記述する形式になっています。

 また、VBはVisual C++等と比べて初心者にもわかりやすく、その一方で商用アプリの開発環境としても採用されるほどのパワフルな言語と言えます。なお、VBで作られたアプリを動作させるには、VBランタイムと呼ばれるDLLファイルが必要になります。このランタイムをロードするため、VBアプリは起動が若干遅いというデメリットもあります。

 アプリケーションのマクロ言語としてVBを採用したのが、VBA (Visual Basic for Applications) です。VBAはVBの開発環境をほぼそのまま継承したもので、VBのもつ多彩な機能を使ってマクロを記述することができます。
 VBAは現在、Microsoft Officeに搭載されています。

 VBの言語の部分だけを継承し、Internet ExplorerやWindows Scripting Hostといったホストアプリケーションから使えるようにしたのがVBS (Visual Basic Scripting Edition;VBScript) です。基本的にボタンや、テキストボックス、チェックボックスといったコントロールを単独では持たず、ホストアプリケーションを介して利用することになります。

 VBSはWebページのインタラクティブ性を向上させる言語としてHTML中で用いられ、あるいはWSHから利用し、バッチファイルよりも高度なスクリプトとして用いられています。

 また、VBSではVBやVBAの持っている機能のうち、いくつかが省かれています。逆にVBSにはあるが、VB・VBAにはない機能というのもあります。これについてはVBSのランゲージリファレンスに詳しい一覧表がありますので、ここでは述べません。

 いかがでしょうか? すでに解説済みの事柄と若干重複が見られますが、VBとVBSについてまとめてみました。たぶん間違いも含まれているでしょうが、つっこまないでください(^^;

[↑]

ActiveXオブジェクトの仕様を知る方法

 WSHの一つの特長として、ActiveXコントロールを利用できる点が挙げられます。しかし、ActiveXオブジェクトのメソッド・プロパティがわからないと事実上使用することができません。Windows Scripting Host Laboratoryでは、「WSHで使えるオブジェクトの解説」のページでいくつかのオブジェクトのメソッド・プロパティを紹介していますが、この情報はそもそもどうやって知ることができるのか、ここで種明かしをしたいと思います。

 それはVBの「オブジェクトブラウザ」を使う方法です。これはまさにオブジェクトにどんなメソッドやプロパティがあるかを知るためのツールです。使い方は、VBのメイン画面でF2を押し起動させ、「オブジェクトブラウザ」のダイアログで右クリックし、「参照設定」を選び、知りたいオブジェクトを選ぶだけです。
 このツールはVBAにも付属していますので、VBもしくはOfficeをお持ちの方は、この方法で調べることができます。

 とはいえ、このツールで得られる情報はメソッドやプロパティの名前とごく簡単な説明だけですので、実際には使ってみないとわからないことが多々あります。(使ってもわからないことも)

 VBもOfficeもお持ちでない方でも、Microsoftのサイトで入手できる、OLE/COM Object Viewerを使用する方法もあります。とりあえず実行すると左側にエクスプローラのようなツリービューが現れるので、"Type Libraries"を展開してみてください。インストールされているActiveXコントロールが表示されると思います。使いたいコントロールをダブルクリックすると、別ウィンドウにその仕様が表示されます。
 ただし、このツールは英語版である上、VBSライクな記述ではないので、使いこなすのは大変かもしれません。(私にもよくわかりません)

 あとCreateObjectメソッドで、引数には基本的に"InternetExplorer.Application"のように「オブジェクトを提供しているアプリケーションの名前.作成するオブジェクトの種類」を指定しますが、これに加えて数字を指定しないとオブジェクトが取得できない場合があります。
 その場合、原始的ですがレジストリエディタを立ち上げ、まず基本となる文字列(ここでは
InternetExplorer.Application)を検索すると、HKEY_CLASSES_ROOT\InternetExplorer.Application.1というキーが見つかるので、Wacript.CreateObject("InternetExplorer.Application.1")とすればいいことがわかります。ただこの場合はHKEY_CLASSES_ROOT\InternetExplorer.Applicationというキーもあるので、Wscript.CreateObject("InternetExplorer.Application")でもOKです。
 #この数字の意味、実はよくわかってません。

[↑]

VBSで正規表現を使う

 VBSの最新バージョン(5.0)では、正規表現が利用できるようになりました。正規表現(Regular Expression)とは、特殊なパターンと呼ばれる文字列を指定することで、指定したテキストに対して検索・置換をおこなうものです。VBSではRegExpオブジェクトが正規表現の機能を提供しています。
 正規表現は、非常に強力な検索手段で、現在でも様々なアプリケーションがそなえもつ機能なので、覚えていて決して損はありません。Windows2000のファイル検索や、一太郎Light2などでも新規に採用されるそうです。また、UNIX系OSを使用するための必須科目といえるかもしれません。いつか「VBS講座」で解説してみたいと思います(いや、その前に私自身が正規表現を覚えねば)。一応VBSランゲージリファレンスの、「RegExpオブジェクト」の、「Patternプロパティ」の項目に、正規表現のパターンの説明があるので、参考にしてみてください。

[↑]

 WSHの原理に迫る

 今までWSHの原理について正直、あまり深く考えたことがなかったのですが、ご要望があったので今回ちょっと勉強してみることにしました。
 とはいえ、WSHの原理は非常に難解で、私など雑誌の解説記事を見てもなかなか理解できませんでした。
 今回は、中間報告と言うことで、理解できた範囲だけ述べたいと思います。この項目に関しては正しさをいっさい保証しませんのであしからずご了承ください…。

 WSHを技術的にまとめると、

 「WSHはActiveX AutomationによりCOM(Component Object Model)オブジェクトを制御し、ActiveX Scriptingによってスクリプティングエンジンをホスティングしている」

となります(と雑誌<ASCII>に書いてあった。この文章を書いたのはMicrosoftのWSH開発担当者)。この一文に含まれる専門用語を読み解いていきましょう。

 COMとは、Windowsのアプリケーション・ダイナミックリンクライブラリ(Explorer,IE,Word,Excel,ファイルシステムのDLLファイルなど)を、様々な機能を持った部品(コンポーネント)から構築するシステムのことで、これらのコンポーネントの持つ機能は他のアプリからも呼び出して利用することができます。
 このCOM化されたコンポーネント(ActiveXコントロール)を呼び出すインターフェースとなるのがActiveX オートメーションです。すなわち、WSHは、ActiveX オートメーションコントローラの一つなのです。
 (ActiveXコントロールとはインターネット用にOLEコントロールのサイズを小さくしたものです。)

 ActiveX Scriptingとは、スクリプティングホストであるWSHと、スクリプティングエンジン (VBScriptやJScriptのインタプリタ;スクリプトファイルを解釈して実行するエンジン) との間を取り持つ働きをするものです。スクリプティングエンジン は、OLEインターフェースによりインタプリタの機能のみをスクリプティングホストに提供しているため、そのスクリプティングエンジンの言語に関わらず同じ動作を実現します。
 なお、ActiveX Scriptingの仕様は公開されており、MS以外のデベロッパが新しいスクリプティングエンジンを開発することができます。上で述べた、PerlScriptもその一つのようです。

 つまり拡張子VBS、JSのスクリプトファイルがエクスプローラ上でダブルクリックされると、関連づけに従ってその内容はwscript.exe (もしくはcscript.exe) というスクリプティングホストに渡され、スクリプティングホストは、ActiveX Scriptingに従ってVBScriptかJScriptのスクリプティングエンジンを呼び出す一方、オートメーションコントローラーとして、各アプリケーションの機能を提供するActiveXコントロールを制御していることになります。

 また、WSH自体がCOM化されているので、この機能(たとえばレジストリアクセス等)は、他のアプリ(たとえばWordのマクロ、IEのスクリプトなど)から呼び出すこともできます。
 ただしWSH自体はIEのようにドキュメントコンテナとしての機能は持っていません。

 いかがですか? WSHは寡黙ですが、裏では結構複雑な処理をやっているんですねえ。

[↑]

魅惑のWSH2.0β版

 別ページにまとめました。こちらをどうぞ。 
 1999年11月に、正式版がリリースされました。

[↑]

スクリプトをエンコードする

 VBSファイルやJSファイルは、シンプルなテキストファイルですが、これをエンコードし、バイナリファイルに変換する方法があります。それには、"Script Encoder"というツールを用います。このツールはここでダウンロードできます(左のツリービューからVBScript→ダウンロードを開いてください)。

 このツールは、そもそもHTMLに記述するスクリプト、もしくはWSHでのログオンスクリプトをバイナリに変換することで、ページを訪れる人・ログオンする人にそのスクリプトの内容を見られないようにするという目的があるようで、結構陰湿なツールかもしれません(エンコードしたスクリプトがあるようなサイトは怖くて見に行けませんね)。改竄抑制にもなるそうですが、はたして?
 しかし、個人でローカルに使うVBSやJSをエンコードすると結構楽しいです。容量は増えるし、動作速度が速くなるわけでもないのですが。この楽しさがわかる人だけ使うといいでしょう。

 使い方は、たとえばa.vbsというファイルをエンコードするには、コマンドラインから

screnc.exe a.vbs a.vbe

のようにします。出力されたa.vbeというファイルがエンコードされたファイルです。これをダブルクリックすると、vbsファイルと同じように実行されます。
 Script Encoderにはオプションスイッチがいくつかありますが、それはヘルプをご覧ください。また、*.jsなら*.jseにします。

 なお、Windows Script 5.0がインストールされていない環境では、vbeファイルが実行できないようなので、インストールしてください。

[↑]

Windows Scripting Componentsとは何か?

 Windows Scripting Componentsは、簡単にいうと、VBSやJSで、再利用可能なActiveXコントロール(COMコンポーネント)を作ろうというものです。サーバースクリプトレットともいいます。

 実際にはXMLフォーマットのWSCファイルを作成します。このWSCファイルには、VBSやJSのコードを書き、プロパティ・メソッド・イベント・定数・オブジェクトID、クラスIDなどを定義します。また他のCOMコンポーネントをインクルードすることも可能です。
 このファイルを実行することで、タイプライブラリを生成し、コンポーネントとしてシステムに登録することができます。(アンインストールも簡単です)

 作成したコンポーネントは、ActiveX(OLE)オートメーションコントローラーである、WSH、Internet Explorer、VBA、などから利用することができます。具体的には他のActiveXコントロールと同様に、CreateObject関数/メソッドで呼び出します。

 Windows Scripting Componentsは、Windows Script5.0以上に付属しています。

 なお、このトピックに関する内容の正しさは、例によって保証できませんのであしからず。ちょっと端折りすぎたかな? 詳しく知りたい方は、MSのページをどうぞ。リファレンスなどがあります。

[↑]

HTA(HTMLアプリケーション)について

 HTA(HTMLアプリケーション)とは、HTML(Dynamic HTML)とスクリプト(VBScript/JScript)・各種ActiveXコントロールを使って作成するアプリケーションの一種です。Internet Explorer5.0をインストールすると、Systemフォルダにmshta.exeというファイルが導入されますが、これがHTMLアプリケーション(.hta)を実行させるホストプログラムです。
 HTAは、基本的にはHTML4.0準拠のHTMLなので、テキストエディタで作成することができます。

 .htaファイルをmshta.exeで動作させると、.htmをIEに読み込ませたときのように、メニュー、ツールバー、ステータスバーなどが表示されず、VBでいうところの「フォーム」のような余計なものが何もついていないウィンドウにHTMLが表示されます。
 このウィンドウの外観などは、.htaファイルの<head>内に、hta:applicationタグという.hta固有のタグに記述することによって変更することができます。これは、VBのフォームのプロパティを設定するのと同様です。hta:applicationタグについては、kiaさんのページ、あるいはMSのページ(日本語概要)(英語リファレンス)を参照してください。

 さて、HTAのもっとも強力な機能は、ActiveXを何の制限もなく利用できることです。objectタグでActiveXコントロールを埋め込んだもの、あるいはスクリプトからCreateObject関数でActiveXオブジェクトの機能呼び出している、通常のHTMLをIEに読み込ませると、デフォルトのセキュリティ設定では、警告のダイアログが表示されたり、まったく実行が不可になってしまいます。特に、ローカルのHTMLファイルに関しては、通常の方法ではセキュリティのカスタマイズができないため、必ず警告が表示されてしまいます。というのも、ActiveXはそれだけ強力であり、インターネットに存在するHTMLファイルから、ローカルのファイルに何の制限もなくアクセスできるという危険性があるため、こういったセキュリティ機能が備わっているわけです。
 HTAは、普通のアプリケーションと同様、基本的にローカルのファイルを実行させるものなので、こういったセキュリティは働かなくなっています。そのため、従来の.htmファイル+IEでは事実上不可能だった、HTMLでのアプリケーション作成が実現したわけです。
 ActiveXオブジェクトは、WshShellやWshNetwork、FileSystemObjectなどがあり、WSHからとほぼ同様に利用することができます(注意:WscriptオブジェクトはWSHの組み込みオブジェクトなので、HTAからは利用できない)。また、WSHでは利用できなかった、HTMLにobjectタグで埋め込むActiveXコントロールも利用できます。どんなコントロールが利用可能で、どんなプロパティ・メソッド・イベントがあるのかを調べるには、ActiveX Control Padが便利です。このツールは、本来HTMLにActiveXコントロールを配置し、スクリプトを記述するためのエディタですが、HTA作成にも威力を発揮します。ただ、このツールはかなり昔からバージョンアップがされておらず、最新のIE・OSでは一部の動作が不安定です。ダウンロードはこちら。これは英語版で、日本語版OSにインストールするには、さらに追加コンポーネントのインストールが必要です。(Important:Japanese users...を参照)

 HTAを実際に作成するには、スクリプトの知識だけではなく、Dynamic HTMLの知識も必要になるでしょう。DynamicHTMLでは、HTMLのドキュメントやウィンドウ、タグなどをそれぞれ「オブジェクト」として扱います。たとえば、<A>タグは、Aオブジェクトとして扱われ、href(リンク先)というプロパティや、OnClick(クリックしたとき)というイベントがあります。このようなオブジェクトに対する、プロパティ・メソッド・イベントを、<script>タグ内に、VBScript/JScriptで記述することで動的なHTMLを実現するのです。DHTMLについては、MSのページのリファレンス(英語です。日本語のページは何処に?)や、他のサイトを参照してください。また、もちろんHTAでも、画像ファイルやスタイルシートなどを使って、見た目を華やかに彩ることも可能です。表現能力に関しては、普通のHTMLと何ら変わりありません。

 このように様々な強力な機能を持っているだけに、「HTAがあるならWSHはもう必要ないのでは?」と思われる方もいらっしゃるかもしれませんが、そうではありません。HTAは、ウィンドウのインターフェースを持つという、WSHにはない利点がありますが、逆にWSHはこういったインターフェースがInputBox、MsgBox程度しかなく、バッチ的な処理に向いています。すなわち、HTAとWSHは目的に応じて使い分けていくのがよいと思われます。

 Microsoftは、HTMLを一つの開発言語としてとらえているようです。ご存じのように、Internet Explorer4.0の登場により、Windowsのシェルがブラウザと統合され、フォルダやデスクトップがHTMLで記述できるようになりました。テキストエディタで作成できる、スクリプトでActiveXコントロールを開発する、Windows Script Componentも誕生しました(余談ですが、HTMLでコンポーネントを作成する、HTC(HTML Component?)という技術もあるそうです)。そして、IE5.0によって、ActiveX+DHTMLでアプリケーションを作成する、HTAが登場しました。さらに、Windows2000 Consumerとも、Windows2001ともいわれている、コンシューマ向けのWindowsで初めてNTカーネルを搭載することになるWindows Neptuneでは、HTMLから直接Win32APIにアクセスできるようになるようです。これによって真の意味で、HTMLが開発言語の一つになると思われます。
 このように、HTMLは21世紀になってもその重要性をますます高めていくことになるのは必至です。将来を見据えて、今からDHTMLやHTAの勉強をするのも悪くないと思います。

 ところで、私もいくつかHTAを作成しています。「ダウンロード」のページでダウンロードできるようになっているので、是非参考にしてみてください。まだ私自身、あまりよくわかっていないので、ところどころ「?」な記述があると思いますが(^^;

[↑]


Home