(現在 過去ログ3 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■360 / inTopicNo.1)  WSH (VBScript) & WMI な事!?
  
□投稿者/ hidetake -(2007/10/09(Tue) 15:33:41)
    2007/10/09(Tue) 18:03:24 編集(投稿者)
    VBScript + WMI での多重実行禁止。
    
    取りあえず、次のような感じで実行されたスクリプトの
    コマンドラインパラメータを取得して、実行したスクリプト
    名と同じものが含まれている場合で、それが2個以上存在したら
    今実行しているスクリプトは中止してしまうと言う処理です。
    
    たとえば、スクリプト名を screensaver_monitor.vbs
    として保存して実行する。
    
    '---------------------------------------------------------------------------
    'On Error Resume Next
    
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME = 'wscript.exe' or NAME = 'cscript.exe'",,48)
    'Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME = 'wscript.exe'",,48)
    'XP以降なら Like演算子も使える
    'Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME Like '%script.exe'",,48)
    
    For Each objItem in colItems
        if UCase(Right(Trim(Replace(objItem.CommandLine, """", "")), Len(WScript.ScriptName))) = UCase(WScript.ScriptName) Then
            ScriptCount = ScriptCount + 1
            if ScriptCount >= 2 Then
                WScript.Quit
            End If
        End If
    Next
    
    ・
    ・
    ・
    
    'WScript.Quit
    '---------------------------------------------------------------------------
    
    

引用返信 [メール受信/OFF] 削除キー/
■361 / inTopicNo.2)  Re[1]: WSH (VBScript) & WMI な事!?
□投稿者/ hidetake -(2007/10/09(Tue) 18:35:02)
    次に桐が実行中で無ければスクリプトを終了するサブルーチン
    必要に応じて定期的に Call すればよい。

    '---------------------------------------------------------------------------
    Sub CheckKiriExist()
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME = 'kiri9.exe'")
    If colItems.Count = 0 Then WScript.Quit
    End Sub
    '---------------------------------------------------------------------------

引用返信 [メール受信/OFF] 削除キー/
■362 / inTopicNo.3)  Re[2]: WSH (VBScript) & WMI な事!?
□投稿者/ 今村 誠 -(2007/10/09(Tue) 22:56:17)
    hidetakeさんこんにちは
    > Sub CheckKiriExist()
    > Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME = 'kiri9.exe'")
    > If colItems.Count = 0 Then WScript.Quit
    > End Sub

    もしかしたら
    Sub CheckKiriExist()
    WScript.Quit
    End Sub
    この一文だけで最初に実行したvbsが止まるのじゃないでしょうか。
    一度実験してみます。
引用返信 [メール受信/OFF] 削除キー/
■363 / inTopicNo.4)  Re[3]: WSH (VBScript) & WMI な事!?
□投稿者/ 今村 誠 -(2007/10/10(Wed) 00:14:43)
    失敗でした(*_*)
    hidetakeさんのを参考に以下の感じで
    scrin.vbsで桐のカレントディレクトリーに保存しました。
    テキストを書き出したら即停止してもらえるといいのですが
    パソコン起動中はずっと常駐します。
    '--------------------------------------------------------------------------
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

    Set objEventSource = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'")

    Do While True
    Set objEventObject = objEventSource.NextEvent()
    If Right(objEventObject.TargetInstance.Name, 4) = ".scr" Then
    Select Case objEventObject.Path_.Class
    Case "__InstanceCreationEvent"
    Call WriteVarFile()
    ' Wscript.Echo "Screensaver " & objEventObject.TargetInstance.Name & _
    ' " started: " & Now
    ' Case "__InstanceDeletionEvent"
    ' Wscript.Echo "Screensaver " & objEventObject.TargetInstance.Name & _
    ' " ended: " & Now
    End Select
    End If
    Loop

    Sub WriteVarFile()
    Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
    Set objTS = objFS.CreateTextFile("screensaver.txt", True, False)
    objTS.WriteLine "スクリーンセーバー作動"
    objTS.Close
    End Sub
    '--------------------------------------------------------------------------
引用返信 [メール受信/OFF] 削除キー/
■364 / inTopicNo.5)  Re[4]: WSH (VBScript) & WMI な事!?
□投稿者/ うにん -(2007/10/10(Wed) 00:29:25)

    > Do While True
    で無限ループにしてるから、終わりたい時にはExit Doしないと終わらない。
    一括処理の「繰り返し中止」ですね。
引用返信 [メール受信/OFF] 削除キー/
■365 / inTopicNo.6)  Re[5]: WSH (VBScript) & WMI な事!?
□投稿者/ 今村 誠 -(2007/10/10(Wed) 12:48:47)
    うにんさんこんにちは

    >>Do While True
    > で無限ループにしてるから、終わりたい時にはExit Doしないと終わらない。
    > 一括処理の「繰り返し中止」ですね。

    書き出しの次の行に記載したら終了してくれました。
    なにかを記載しないと終わってくれないと思いますが
    構文全く知らないので頼ってしまいました。
    タイマーはフォーカスのメインサブの位置に関係なく動作中で
    サブがメインの項目でグループ化されているとエラーを出していた
    のですが、メインでもサブのボタンでグループ解除したら上書き
    できて保存終了まで進みました。
     サブのタイマーは必要なくなりました。(^。^)
    客先ではメールを見ながら入力することもあり得るのでレコード移動より
    スクリーンセーバーの方が適していると思っています。
    hidetakeさんうにんさんありがとうございました。
引用返信 [メール受信/OFF] 削除キー/
■367 / inTopicNo.7)  Re[2]: WSH (VBScript) & WMI な事!?
□投稿者/ hidetake -(2007/10/10(Wed) 13:19:10)
    2007/10/10(Wed) 13:25:39 編集(投稿者)
    次のようなのでどうでしょうかね? テストは十分に
    行ってみてください。
    一応 XP 対象でのスクリプトです。
    
    何度実行しても1つのスクリプトしか常駐しないです
    し、桐が起動していない状態では自動終了します。
    
    FlgFile は実際の置き場所に変えたり、負荷によって
    は Loop に Sleep を入れてみても良いと思います。
    
    'screensaver_monitor.vbs
    '------------------------------------------------------------------------------
    Option Explicit
    
    Dim strComputer, objWMIService, colItems, objItem, ScriptCount
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    
    'Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME = 'wscript.exe' or NAME = 'cscript.exe'")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME Like '%script.exe'")
    
    For Each objItem in colItems
        If UCase(Right(Trim(Replace(objItem.CommandLine, """", "")), Len(WScript.ScriptName))) = UCase(WScript.ScriptName) Then
            ScriptCount = ScriptCount + 1
            If ScriptCount >= 2 Then
                WScript.Quit
            End If
        End If
    Next
    
    Dim FS, FlgFile, objFlgFile
    Set FS  = WScript.CreateObject("Scripting.FileSystemObject")
    FlgFile = "x:\path\screensaver.flg"
    Call DeleteFlgFile()
    
    Dim objEventSource, objEventObject
    Set objEventSource = objWMIService.ExecNotificationQuery _
        ("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'")
    
    Do While True
        Set objEventObject = objEventSource.NextEvent()
        If Right(objEventObject.TargetInstance.Name, 4) = ".scr" Then
            Select Case objEventObject.Path_.Class
                Case "__InstanceCreationEvent"
                    Call CreateFlgFile()
                Case "__InstanceDeletionEvent"
                    Call DeleteFlgFile()
            End Select
        End If
        If CheckKiriExist() = 0 Then Exit Do
    Loop
    
    Call DeleteFlgFile()
    WScript.Quit
    
    Function CheckKiriExist()
        Set colItems = objWMIService.ExecQuery("Select * from Win32_Process WHERE NAME = 'kiri9.exe'")
        CheckKiriExist = colItems.Count
    End Function
    
    Sub CreateFlgFile()
        Set objFlgFile = FS.CreateTextFile(FlgFile)
        objFlgFile.Close
    End Sub
    
    Sub DeleteFlgFile()
        If FS.FileExists(FlgFile) = True Then
            FS.DeleteFile FlgFile, True
        End If
    End Sub
    '------------------------------------------------------------------------------
    
    あとは桐から適当な指令(ファイル作成)を行ったら
    常駐解除する仕組みも取り入れても良いでしょう。
    


screensaver_monitor.vbs.txt
/1KB
引用返信 [メール受信/OFF] 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -