WSC(Windows Script Components) を書いてみる。

[test.wsc]
<?xml version="1.0" standalone="yes" encoding="Shift-JIS" ?>
<package>
<?component error="True" debug="True"?>  コンポーネントのデバッグ処理、エラーを有効にする
<component id="orgComp">
  <registration progid="orgComp.test" version="1" remotable="True" />
    <public>
	<method name="test" />
    </public>
<script language="VBScript">
<![CDATA[
Function test()
	test = Now()
End Function
]]>
</script>
</component>
</package>

呼び出し
Set objtst = Server.CreateObject("orgComp.test")
Response.Write objtst.test

レジストリに登録が必要です。(右クリックで登録、削除が出来ます)
  > regsvr32 test.wsc

他のマシンに実行させてみる(実行させるマシンでも登録が必要)

呼び出し元マシンで、
 Set objtst = CreateObject("orgComp.test", "呼び出し先サーバー名")
 Response.Write objtst.test
とかで動きます。※ Server.CreateObject は第2パラメータの指定が出来ません。

	下記設定がいるかも。

	COM+ に登録してクラス ID を抜き出し、test.wsc に classid を加える。

	『コンポーネントサービス』(コントロールパネル>管理ツール)を起動
	空の「COM+アプリケーション」を新規作成
	上記「コンポーネント」(orgComp.test)を新規追加
	 プロパティから CLSID(値は128ビット)を抜き出しす。

	  <registration progid="orgComp.test" version="1" remotable="True" classid={ef541bc1-1864-4dbb-bvve-97a8742392ff}
	 ※remotable="True" にした場合、分散環境で別のマシンにコンポーネントのインスタンス(コピー)を作ることが出来る。

	追加したら、「アプリケーション」のエクスポート
	呼び出し先マシンにコピーし、『コンポーネントサービス』を起動
	既成の「アプリケーション」のインストールからコピーしたファイルを指定

ASP スクリプト コンポーネントの実装
スクリプトからタイプ ライブラリにアクセスする方法はありますか
WMI スクリプト入門 : 第 1 部
WMI スクリプト入門 : 第 2 部


 クラスIDの簡単な作成方法

 Set TypeLib = CreateObject("Scriptlet.TypeLib")
 strGUID = TypeLib.Guid
 Set objIE = CreateObject("InternetExplorer.Application")
 objIE.Navigate("about:blank")
 objIE.document.parentwindow.clipboardData.SetData "text", strGUID
 objIE.Quit
 ※クラスIDを生成してクリックボードへコピーします。

 ついでに、クリップボードからの取得
 Set objIE = CreateObject("InternetExplorer.Application")
 objIE.Navigate("about:blank")
 strText = objIE.document.parentwindow.clipboardData.GetData("text")
 objIE.Quit
 Wscript.Echo strText

  参考
  スクリプトを使用して GUID を作成することはできますか
  http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/feb05/hey0221.mspx
  クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますか
  http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx


 ActiveX が安全だとマークする方法
 HKEY_CLASSES_ROOT\CLSID\{A697E83F-3B53-11D1-8AE4-006097ED2008}\Implemented Categories\

 この下に許可する CSLID を追加。
 詳しくは KB909738 http://support.microsoft.com/kb/909738


Ping するツールを作ってみた。

Netdive.wsc
-------------------------------------------------------------
<?xml version="1.0" standalone="yes" encoding="Shift-JIS" ?>
<package>
<?component error="True" debug="True"?>
<component id="Netdive">
<registration progid="Netdive.ping" version="1" remotable="True" classid="{E631397E-0C13-4D04-85EC-D804C970CA7A}"/>
<public>
  <property name="IP" put="setIP" get="getIP" />
  <method name="ping" />
</public>
<object id="WshShell" progid="WScript.Shell" />
<script language="VBScript">
<![CDATA[
Dim strIP
Function setIP(newIP)
  strIP = newIP
End Function
Function getIP()
  getIP = strIP
End Function
Function ping()
  Const PING_CMD = "ping -n 1 -w 100 "
  Const PING_OK_STR = "Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),"
  Dim sCmdLine
  sCmdLine = PING_CMD & strIP
  Ping = CBool(InStr(WshShell.Exec( sCmdLine ).StdOut.ReadAll, PING_OK_STR))
End Function
]]>
</script>
</component>
</package>
-------------------------------------------------------------
右クリックで登録後
※VISTA や Windows Server 2008 では、コマンドプロンプトを管理者権限で実行後に regsvr32 Netdive.wsc で登録できます。又は RUNAS コマンドで。

VBScript の場合
ping.vbs
-------------------------------------------------------------
Dim objtst
Set objtst = CreateObject("Netdive.ping")
With objtst
 .ip = "61.194.16.124"
End With
Wscript.Echo "Ping Address:" & objtst.ip
Wscript.Echo "結果:" & objtst.ping
Set objtst = Nothing
-------------------------------------------------------------
ASPの場合
ping.asp
-------------------------------------------------------------
<%
Set objtst = Server.CreateObject("Netdive.ping")
With objtst
 .ip = "61.194.16.124"
End With
Response.Write "Ping Address:" & objtst.ip & "<br>"
Response.Write "結果:" & objtst.ping
Set objtst = Nothing
%>
-------------------------------------------------------------
HTML でクライアントサイドで実行(未チェック)※HTML を表示する端末で事前に Netdive.wsc を登録しておく必要があります。
<object id=objtst clsid="clsid:E631397E-0C13-4D04-85EC-D804C970CA7A"></object>
<script language="vbs">
objtst.ip = "61.194.16.124"
ip.InnerHTML = objtst.ping
</script>
<div id="ip"></div>
-------------------------------------------------------------
Ping 部分は
http://winscript.s41.xrea.com/wiki/index.php
のスプリクトを利用させて頂きました。

後は、好き勝手に応用して下さいな。

※IISで別マシンから呼び出す場合はアクセス権に注意。

Set objtst = GetObject("script:c:\wsc\Netdive.wsc") 
と書くと登録しなくても使えるようです(未確認)
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/letusingapp.asp


その他
 Windows XP Service Pack 2 でリモート デバッグを有効にする方法
 http://support.microsoft.com/default.aspx?scid=kb;ja;833977
 リモート デバッグのセットアップ
  http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsdebug/html/vctskinstallingremotedebugmonitor.asp

単純にリモートで操作させるには下記記事参考に
  リモート WSH をセットアップする
  リモート・スクリプト実行のしくみと下準備(@IT)

ちなみに、ActiveX DLL の作り方も同じような感じです。

 Private StrIP As String
 Public Property Get IP() As String
  IP = strIP
 End Property
 Public Property Let IP(newIP As String)
  StrIP = newIP
 End Property
------------------------------------------
て、クラスを宣言する感じで作成できます。

.NET Framework のばあいも同じですが、regsvr32.exe の代わりに RegAsm.exe を使っての登録になります。
コードを書くとこんな感じ。

Private StrIP As String
Public Property IP() As String
    Get
        Return StrIP
    End Get
    Set(ByVal newIP As String)
        Dim pg As New System.Net.NetworkInformation.Ping()
        Dim pr As System.Net.NetworkInformation.PingReply
        Dim s As String
        pr = pg.Send(newIP, 5)
        If pr.Status = System.Net.NetworkInformation.IPStatus.Success Then
            s = True
        Else
            s = False
        End If
        pg = Nothing
        pr = Nothing
        StrIP = s
    End Set
End Property

'ついでにIPアドレスからホストネームを調べる
Public ReadOnly Property HostName() As String
    Get
        Dim s As String
        Try
            s = System.Net.Dns.GetHostByAddress(StrIP).HostName
        Catch
            s = ""
        End Try
        Return s
    End Get
End Property

コンパイルしたDLLはこちら。※ホストネーム分は含まれていませんhttp://www.netdive.jp/download/ping.zip

クラスへ登録
x86
%windir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe netdive.dll /codebase
x64
%windir%\Microsoft.NET\Framework64\v2.0.50727\regasm.exe netdive.dll /codebase
後に

Set objNETDIVE = Wscript.CreateObject("netdive.ping1")
objNETDIVE.ip = "115.187.66.173"
Wscript.Echo objNETDIVE.ip
Set objNETDIVE = Nothing

てな感じで。.NET Framework のインストールが必要だし、使い道はなさそうだけど。

ちなみに登録解除は、/unregister
------------------------------------------
PowerShell から呼び出す
[Reflection.Assembly]::LoadFile("c:\netdive.dll")
$netdive = new-object netdive.ping1
$netdive.ip = "115.187.66.173"
objNETDIVE.ip
-------------------------------------------------------------

COM+ を利用したい場合は
http://msdn.microsoft.com/ja-jp/library/ms973809.aspx
http://msdn.microsoft.com/ja-jp/library/bctyca52.aspx
http://support.microsoft.com/kb/316516/
http://support.microsoft.com/kb/183771/
を参考に。
ActiveX DLL を使って IEからコントロールできるようになります。

C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには? − @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/1064combycs/combycs.html



ScriptLets 内で Response 等 ASP ハンドラを扱いたい場合は
<implements type="ASP" />
の1行を>object ・・・ の下の行辺りに追加すると利用出来るようになります。
WSC から Application、Session 変数にアクセスする場合は、 Application.Contents() とする必要がある事に注意

DHTML ビヘイビアハンドラ は
<implements type="Behavior" />
http://www.microsoft.com/japan/msdn/columns/scripting/scripting091399.aspx


Ping の実行
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/ping/




スマートピット 決済システム構築で、スマートピットも自動化出来るように作成しました。 SmartPit.zip SmartPit.zip には、 SmartPit.wsc と readme.txt が含まれています。 詳しくはreadme.txtを見て下さい。 物がナニなので使える人は限定されますが・・・ MSXML を扱っています。 システムというか仕組みそのものの欠陥?について どうも流通システムそのものに問題があるようで、、、 コンビニで入金>サービス開始。>コンビニで返金 ってされる恐れがあります。 全て自動化してサービスを提供している場合、トラブルになりますのでご注意を。。。
VBA の機能で VBScript に含まれていない機能 Select Case ステートメント  キーワード Is または比較演算子が含まれる式  キーワード To を使う値の範囲の指定が含まれる式 エラー処理  Erl 関数  Error ステートメント  Resume ステートメント、Resume Next ステートメント 演算子  Like 演算子 オブジェクト  Clipboard オブジェクト  Collection オブジェクト オブジェクトの使用  演算子を使用したコレクションへの参照 オブジェクト操作  キーワード TypeOf コレクション  Add メソッド、Count プロパティ、Item メソッド、Remove メソッド  ! 演算子を使用したコレクションへの参照 財務処理  すべての財務処理関数 条件分岐  #Const ディレクティブ  #If...Then...#Else ディレクティブ 制御構造  DoEvents 関数  GoSub...Return ステートメント、GoTo ステートメント  On Error GoTo ステートメント  On...GoSub ステートメント、On...GoTo ステートメント  行番号、行ラベル 宣言  Declare ステートメント (DLL 参照のための宣言)  キーワード Optional  キーワード ParamArray  Static ステートメント ダイナミック データ エクスチェンジ (DDE)  LinkExecute メソッド、LinkPoke メソッド、LinkRequest メソッド、LinkSend メソッド データ型  バリアント型 (Variant) を除くすべての組み込みデータ型  Type...End Type ステートメント デバッグ  Debug.Print  End ステートメント、Stop ステートメント 配列  Option Base ステートメント  0 以外のインデックスの最小値を指定した配列の宣言 日付と時刻  Date ステートメント、Time ステートメント その他  Deftype ステートメント  Option Base ステートメント  Option Compare ステートメント  Option Private Module ステートメント ファイル入出力  すべてのファイルの入出力機能 変換  CVar 関数、CVDate 関数  Str 関数、Val 関数 文字列  固定長文字列  LSet ステートメント、RSet ステートメント  Mid ステートメント  StrConv 関数 Visual Basic Scripting Edition VBA の機能で VBScript に含まれていない機能
資料  スクリプトからタイプ ライブラリにアクセスする方法はありますか  WMI スクリプト入門 : 第 1 部  WMI スクリプト入門 : 第 2 部  ステップ 7 イントロ オンライン セミナー : Visual Studio 2005 による分散アプリケーション開発編 「第 2 回 データ層の開発」