Start the process when it is not running (by vbscript)

Иногда требуется проверить запущен ли процесс (например, notepad.exe) под пользователем (user1), чтобы случайно не запустить его дважды, или вообще запустить его, если он отсутствует в списке процессов. Я описал пример запуска java.exe для компиляции apex.war (запуска Oracle Apex listener 2.0.3), при условии, что база данных APEX (Oracle) работает и процесс не запущен. Для проверки запущен ли процесс, написал функцию SearchProcess, которая возвращает 1, если процесс запущен.

'(с) 19.05.2014
Dim ObjShell, Shell
Dim ObjProc
Dim StrORA
Dim dblist
Dim chekdir
Dim procname
Dim ownername
Dim Res
Dim JavaHome

'Указываем путь к java.exe нужно нам версии
JavaHome="c:\Program Files\Java\jdk1.6.0_18\bin\java.exe"

'Подключение к базе (Oracle)
Set ObjShell = CreateObject("WScript.Shell")
WScript.Sleep 600
StrORA = "sqlplus /@APEX as sysdba @x:\apexlistener\connect.sql" 'файл connect.sql содержит следующий код: select sysdate from dual; exit
Set ObjProc = ObjShell.Exec(StrORA)

input = ""
strOutput = ""
'Читаем output нашего соединения к базе
Do While Not ObjProc.StdOut.AtEndOfStream
input = input & vbCrLf & ObjProc.StdOut.ReadLine
Loop

'Если соединение завершилось успешно
If InStr(input, "SYSDATE") Then
'Проверяем запущен ли процесс под этим владельцем
Res = SearchProcess("java.exe", "orauser")
If Res 1 Then
StrORA = JavaHome & " -Dapex.home=x:\apex\8090 -Dapex.port=8090 -Dapex.images=x:\apex\images -jar apex.war"
Set ObjProc = ObjShell.Exec(StrORA)
End IF
Else
'WScript.Echo "ORACLE is DISABLE!"
End If

Function SearchProcess(procname, ownername)
'(c) 19.05.2014
'What's: проверяет запущен ли процесс на компьютере и кто его владелец
' procname - имя процесса
' ownername - имя пользователя, под кем запущен процесс

Dim strComputer ' Имя компьютера
Dim objService ' Объект SWbemServices
Dim colProcesses ' Коллекция экземпляров класса WMI
Dim objProcess ' Элемент коллекции
Dim WshShell ' Объект WshShell
Dim cnt 'счетчик
Dim Return
Dim strNameOfUser

Set WshShell = WScript.CreateObject("WScript.Shell")

' "." - локальный компьютер
strComputer = "."

' Подключаемся к пространству имен WMI
Set colProcesses = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").ExecQuery("SELECT * FROM Win32_Process")

if colProcesses.Count > 0 Then

'Перебираем коллекцию
For Each objProcess in colProcesses

'Проверяем искомый процесс
If objProcess.Name = procname Then
' Проверяем владельца процесса
Return = objProcess.GetOwner(strNameOfUser)
If Return = 0 Then
If strNameOfUser = ownername Then
SearchProcess = 1
'WScript.Echo "Process " & objProcess.Name & " is owned by " & "\" & strNameOfUser & "."
End If
End If
End If
Next
End If

End Function 
Реклама