2011年5月29日日曜日

リモートマシンで共有ファイルを開かせる

このシステムのしくみ


サーバーにてExcSnd.vbsを実行すると、ExcSnd.vbsのプログラム上でリモートマシンに接続し、サーバー上のファイルを開かせる。
このサンプルでは、サーバー上にあるExcSnd.exeという音を出すファイルをリモートマシン上で実行させるためのVBScript。
サーバー上で実行するのは、Facade.vbs。
Facade.vbsより、メインのExcSnd.vbsを実行する。
Facade.vbsでは、他にもいくつかの共通モジュールを使用している。
それらの共通モジュールは、いかちソフトウェアVBScriptサイトから入手できる。

ExcSnd.vbs
  1. Option Excplicit
  2. '==============================
  3. ' 定数定義
  4. '==============================
  5. 'サーバー名
  6. 'TODO:サーバー名を指定
  7. Const SERVER_NAME = "[サーバー名]"
  8. '共有フォルダ名
  9. '※ExcSnd.exeは、VBSモジュールと同一のフォルダに格納し、共有フォルダに設定
  10. Const SHARED_PATH = "TEST\source\ExcSnd\"
  11. '対象マシン一覧ファイル
  12. Const TARGET_MACHINE_FILE = ".\tgtfnlst.csv"
  13. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  14. ' 警告音を出すためのクラス
  15. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  16. Class ExcSnd
  17.     '==============================
  18.     ' 変数定義
  19.     '==============================
  20.     'メッセージ
  21.     Private mstrMessage
  22.     '==============================
  23.     ' プロパティ
  24.     '==============================
  25.     'メッセージ
  26.     Public Property Get Message()
  27.         Message = mstrMessage
  28.     End Property
  29.     Private Property Let Message(ByVal vstrMsg)
  30.         mstrMessage = vstrMsg
  31.     End Property
  32.     '********************************************************************************
  33.     ' メソッド名:PlaySound
  34.     ' 概要   :警告音を出す(Windows XP Exclamation.wav)
  35.     ' パラメータ:なし
  36.     ' 戻り値  :正常実行ならTrue、そうでなければFalse
  37.     '********************************************************************************
  38.     Public Function PlaySound()
  39.         PlaySound = False
  40.         '対象マシンの一覧を読み込み
  41.         Dim varMachine
  42.         If ReadMachineList(varMachine) = False Then
  43.             Exit Function
  44.         End If
  45.         '対象マシンの警告音を出す
  46.         If UBound(varMachine) > 0 Then
  47.             If PlaySoundPersonal(varMachine) = False Then
  48.                 Exit Function
  49.             End If
  50.         End If
  51.         PlaySound = True
  52.     End Function
  53.     '********************************************************************************
  54.     ' メソッド名:ReadMachineList
  55.     ' 概要   :警告音を出す対象となるマシンの一覧を読み込む
  56.     ' パラメータ:[rvarMachine] - 対象マシン一覧
  57.     ' 戻り値  :正常に読み込めたらTrue、そうでなければFalse
  58.     '********************************************************************************
  59.     Private Function ReadMachineList(ByRef rvarMachine)
  60.         ReadMachineList = False
  61.         Dim objTfm
  62.         Set objTfm = New TextFileManager
  63.         Dim strBuf
  64.         strBuf = objTfm.ReadText(TARGET_MACHINE_FILE)
  65.         rvarMachine = Split(strBuf, vbCrLf)
  66.         ReadMachineList = True
  67.     End Function
  68.     '********************************************************************************
  69.     ' メソッド名:PlaySoundPersonal
  70.     ' 概要   :マシン個別に警告音を出す
  71.     ' パラメータ:[rvarMachine] - 対象マシン一覧
  72.     ' 戻り値  :正常に音声出力できたらTrue、そうでなければFalse
  73.     '********************************************************************************
  74.     Private Function PlaySoundPersonal(ByRef rvarMachine)
  75.         PlaySoundPersonal = False
  76.         On Error Resume Next
  77.         Dim i
  78.         For i = 0 To UBound(rvarMachine)
  79.             If rvarMachine(i) = "" Then
  80.                 Exit For
  81.             End If
  82.             Dim objWMIService
  83.             Set objWMIService = GetObject("winmgmts:\\" & rvarMachine(i) & "\root\cimv2:Win32_Process")
  84.             Dim intProcessID
  85. 'TODO:管理者ユーザーIDと管理者ユーザーパスワードの指定
  86.             Call objWMIService.Create("net use \\" & SERVER_NAME & "\C$ /user:" & SERVER_NAME & "\[管理者ログインID] [管理者ログインパスワード]", Null, Null, intProcessID)
  87.             '※音がなったりならなかったりと不安定のため
  88.             WScript.Sleep 3000
  89.             Call objWMIService.Create("\\" & SERVER_NAME & SHARED_PATH & "excsnd.exe", Null, Null, intProcessID)
  90.             '※音がなったりならなかったりと不安定のため
  91.             WScript.Sleep 3000
  92.             Call objWMIService.Create("net use \\" & SERVER_NAME & "\C$ /delete", Null, Null, intProcessID)
  93.             Set objWMIService = Nothing
  94.             If (Err.Number <> 0) Then
  95.                 Message = CStr(Err.Number) & ":" & Err.Desciption
  96.                 Exit Function
  97.             End If
  98.         Next
  99.         On Error GoTo 0
  100.         PlaySoundPersonal = True
  101.     End Function
  102. End Class

Facade.vbs

  1. '※このプログラムを実行するには、管理者権限が必要です
  2. Option Explicit
  3. Dim fso
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. Function Include(ByVal fileName)
  6.     Include = fso.OpenTextFile(fileName, 1, False).ReadAll()
  7. End Function
  8. Execute Include(".\ExcSnd.vbs")
  9. Execute Include("..\..\common\FileCommon.vbs")
  10. Execute Include("..\..\common\TextFileManager.vbs")
  11. Execute Include("..\..\common\LogFile.vbs")
  12. '********************************************************************************
  13. ' 関数名:Main
  14. ' 概要 :警告音再生
  15. ' 引数 :なし
  16. ' 戻り値:なし
  17. '********************************************************************************
  18. Sub Main()
  19.     Dim startTime
  20.     startTime = Now()
  21.     Dim es
  22.     Set es = New ExcSnd
  23.     Dim bRet
  24.     bRet = es.PlaySound()
  25.     If (bRet = False) Then
  26.         Call WriteLog(startTime, es.Message)
  27.     End If
  28.     Set es = Nothing
  29. End Sub
  30. '********************************************************************************
  31. ' 関数名:WriteLog
  32. ' 概要 :エラーログを出力する
  33. ' 引数 :[startTime] - 実行開始
  34. '     [msg] - メインクラスからのメッセージ
  35. ' 戻り値:なし
  36. '********************************************************************************
  37. Sub WriteLog(ByVal startTime, ByVal msg)
  38.     Const LOGFILE_PATH = "L:\警告音再生エラーログ.log"
  39.     Dim fc
  40.     Set fc = New FileCommon
  41.     Call fc.FileDelete(LOGFILE_PATH)
  42.     Set fc = Nothing
  43.     Dim oLog
  44.     Set oLog = New LogFile
  45.     oLog.FileName = LOGFILE_PATH
  46.     Dim sLog
  47.     sLog = ""
  48.     sLog = sLog & "実行開始時間:" & CStr(startTime) & vbCrLf
  49.     sLog = sLog & "実行終了時間:" & CStr(Now()) & vbCrLf
  50.     sLog = sLog & vbCrLf
  51.     sLog = sLog & "警告音再生に失敗しました。" & vbCrLf
  52.     sLog = sLog & "エラーの詳細は、以下のとおりです。" & vbCrLf
  53.     sLog = sLog & vbCrLf
  54.     sLog = sLog & msg & vbCrLf
  55.     oLog.AddText sLog
  56.     Set oLog = Nothing
  57. End Sub

0 件のコメント:

コメントを投稿