PDA

Показать полную графическую версию : Скрипт, проверяющий программу и предлагающий ее запустить если она вырубилась


Страниц : [1] 2

koresaram
28-08-2018, 08:28
Всем привет

исходные данные:
на компе должна работать программа c:programm files/proga.exe
периодически она вылетает и ее приходится запускать руками
пояснение - прога на удаленном компе и там нет мышки клавиатуры (там тач пад можно пальцем в экран ткнуть), чтобы пользователь смог зам ее запустить (мышкой и клавиатурой прогу запустить можно только из диспетчера задач). Приходится подключаться по тимке и включать им ее.

надо:
скрипт, который будет, к примеру, каждые 10 минут проверять наличие процесса proga.exe и если такой процесс не обнаружен, выводить окно на экран с предложением запустить программу Да/Нет
соответственно при нажатии на Да - запускается proga.exe а при нажатии на Нет скрипт уходит в свой обычный режим и через 10 минут снова предложит запустить прогу. И еще этот скрипт должен выключать процесс експлорера (при вылете программы этой остается окно "Мой компьютер"


Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill
Dim WshShell
strComputer = "."
strProcessKill = "'explorer.exe'"

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "c:\Program Files\PROGA.exe" & Chr(34), 0
Set WshShell = Nothing

WScript.Quit


есть вот такая штука (файл сценария VBScript). Если в нее ткнуть, то прога запускается и експлорер убирается. Вот если к ней еще интерактив прикрутить будет хорошо/

YuS_2
28-08-2018, 08:55
прога на удаленном компе и там нет мышки клавиатуры »
выводить окно на экран с предложением запустить программу Да/Нет »
Шлем распознавания мысленных команд? :)

koresaram
28-08-2018, 09:13
Шлем распознавания мысленных команд? »
поправил описание. там тачпад ) пальцем можно ткнуть в экран )

Busla
28-08-2018, 10:11
koresaram, создайте примерно такую задачу на каждые 10 минут:
cmd.exe /c "tasklist | findstr /B notepad.exe || "c:\Windows\notepad.exe""

UPD упустил из вида, что вам нужно интерактивное взаимодейсвие с пользователем, тогда действительно лучше WSH

тачпад - это сенсорный квадратик на ноутбуках под клавиатурой, а "пальцем в экран" - это тачскин

YuS_2
28-08-2018, 11:58
пальцем можно ткнуть в экран »
можно на powershell организовать скрипт, если устроит.
wait-process будет ожидать завершения процесса, а по завершении можно прикрутить действие на запуск формы с кнопками... в общем, варианты есть, но если требуется именно wsh...

koresaram
28-08-2018, 12:05
можно на powershell организовать скрипт, если устроит.
wait-process будет ожидать завершения процесса, а по завершении можно прикрутить действие на запуск формы с кнопками... в общем, варианты есть, но если требуется именно wsh... »

я в программировании не силен ) поэтому не знаю на каком языке это можно сделать. По идее хоть на вбс лишь бы работало. Там еще момент упустил (добавил в описание) при вылете программы этой появляется окно експлорера "мой компьютер" вот его надо закрывать.

тачпад - это сенсорный квадратик на ноутбуках под клавиатурой, а "пальцем в экран" - это тачскин »

да тачскрин, согласен )

Iska
28-08-2018, 12:35
скрипт, который будет, к примеру, каждые 10 минут проверять наличие процесса proga.exe и если такой процесс не обнаружен, выводить окно на экран с предложением запустить программу Да/Нет
соответственно при нажатии на Да - запускается proga.exe а при нажатии на Нет скрипт уходит в свой обычный режим и через 10 минут снова предложит запустить прогу. »
В чём глубинный смысл действий скрипта в этом случае?! Я не понимаю.

Я понимаю так: скрипт проверяет наличие исполняемого файла приложения. Скрипт запускает приложение. Скрипт следит за тем, что приложение работает (причём — именно за тем экземпляром приложения, который был запущен самим скриптом, игнорируя любые прочие экземпляры того же приложения). Как только данный экземпляр приложения завершается — скрипт немедленно запускает новый экземпляр и начинает следить за ним.

koresaram
28-08-2018, 13:13
В чём глубинный смысл действий скрипта в этом случае?! Я не понимаю. »
смысл в следующем - есть кассовая программа (компы это кассы в магазинах). И эта кассовая proga.exe периодически вылетает. То есть в процессах она пропадает (и вместо нее выходит окно експлорера "Мой компьютер". Ее надо включать, чтобы касса работала дальше. На текущий момент продавец звонит и сообщает что программа вылетела (я подключаюсь по тимке и запускаю ее через диспетчер задач). То есть процесс там один. Их не может быть 2 (второй не запустится, а выдаст сообщение, что прога уже запущена. Это в самой проге заложено).

То есть скрипт чекает наличие процесса proga.exe если процесс есть - значит прога работает и делать ничего не надо (следующий чек через 10 минут). Если процесса нет -выводится интерактивное окно - Включить кассу? Да/Нет. Возникает вопрос а зачем тогда Нет? Бывают случаи, когда программу надо принудительно выключить (например обновляется бд, а при включенной проге обращение к бд не дает скопировать файлы). вот для этого случая нужен вариант Нет.

YuS_2
28-08-2018, 13:42
поэтому не знаю на каком языке это можно сделать. По идее хоть на вбс лишь бы работало. »
Дык, написать можно на том языке, который в наличии на целевом компьютере, если нет желания позаниматься установкой среды в которой будет выполняться написанное. Есть там powershell? Вот от этой печки и надо плясать...

Busla
28-08-2018, 14:49
кассы в магазинах - это легко может быть какой-нибудь Embedded XP

Iska
28-08-2018, 15:13
koresaram, мне не нравится Ваш подход в принципе. Предлагаю свой:
Option Explicit

Const strPath2Programm = "C:\Program Files\VideoLAN\VLC\vlc.exe"


Dim objFSO
Dim objWshShell

Dim lngProcessID
Dim intRetValue


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
If objFSO.FileExists(strPath2Programm) Then
Do
If .Get("Win32_Process").Create(strPath2Programm, objFSO.GetParentFolderName(strPath2Programm), Nothing, lngProcessID) = 0 Then
WScript.Sleep 1000
objWshShell.AppActivate lngProcessID

.ExecNotificationQuery( _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE " & _
"TargetInstance ISA 'Win32_Process' AND " & _
"TargetInstance.ProcessID = '" & CStr(lngProcessID) & "'").NextEvent

intRetValue = objWshShell.Popup("Процесс [" & strPath2Programm & "] был завершён." & vbLf & vbLf & "Запустить процесс снова?", 10, "Повторный запуск процесса", vbYesNo + vbQuestion)

Select Case intRetValue
Case -1, 6 ' Ничего не было нажато, Нажата кнопка «Да»
' Nothing to do
Case Else
Exit Do
End Select
Else
WScript.Echo "Не удалось запустить процесс [" & strPath2Programm & "]."
WScript.Quit 2
End If
Loop
Else
WScript.Echo "Не удалось найти файл [" & strPath2Programm & "]."
WScript.Quit 1
End If
End With

Set objWshShell = Nothing
Set objFSO = Nothing

WScript.Quit 0

Будут вопросы по коду — задавайте.

YuS_2
28-08-2018, 15:15
легко может быть »
о чем и речь, собственно:
Продукты WinRM 2.0 и PowerShell 2.0 можно установить на компьютерах со следующими операционными системами:
Windows Server 2008 с пакетом обновления 1 (SP1);
Windows Server 2008 с пакетом обновления 2 (SP2);
Windows Server 2003 с пакетом обновления 2 (SP2);
Windows Vista с пакетом обновления 2 (SP2);
Windows Vista с пакетом обновления 1 (SP1);
Windows XP с пакетом обновления 3 (SP3);
Windows PowerShell 2.0 можно установить в следующих поддерживаемых операционных системах:
Windows Embedded Standard 2009
Windows PowerShell 2.0 для Windows Embedded Standard 2009 можно загрузить с MyOEM. Макрокомпонент также доступен с MyOEM.
Windows Embedded POSReady 2009;
Windows PowerShell 2.0 для Windows Embedded POSReady 2009 можно загрузить с MyOEM.

Для работы Windows PowerShell 2.0 требуется среда CLR версии 2.0. Командлеты, разработанные для Windows PowerShell 2.0, должны быть скомпилированы для среды CLR версии 2.0. Среда CLR 2.0 включена в версии Microsoft .NET 2.0, 3.0 или 3.5 с пакетом обновления 1.

koresaram
28-08-2018, 16:38
кассы в магазинах - это легко может быть какой-нибудь Embedded XP »
Дык, написать можно на том языке, который в наличии на целевом компьютере, если нет желания позаниматься установкой среды в которой будет выполняться написанное. Есть там powershell? Вот от этой печки и надо плясать... »

там разные. есть винХП есть вин8 есть вин10
но указанный в теме код (вбскрипт) работает на всех. что такое пауершелл я хз )

koresaram
28-08-2018, 17:16
Что-то идет не так )

https://clip2net.com/s/3WklZYF картинка ссылка на климптунет

я скопировал код, сохранил его как frontolstart.vbs закачал на кассу и вырубил фронтол. exe (пусть к программе в скрипте поменял с vlc на frontol). Прошло 15 минут - ничего не происходит. Как узнать "подходит ли скрипт под ту среду, которая стоит на кассе"? я не программист, поэтому, надеюсь, понятно, что я хотел сказать )

Iska
28-08-2018, 17:23
что такое пауершелл я хз »
PowerShell — cкриптовый язык, работающий в консоли (собственной), базирующийся на платформе Microsoft .Net, пришёл на замену пакетным файлам и WSH, поддерживает Automation (где-то лучше, где хуже, нежели WSH) и даёт, естественно, доступ ко всем классам .Net, при желании можно пользовать низкоуровневые (ну, относительно низкоуровневые :)) вставки на C#.

PowerShell — Википедия (https://ru.wikipedia.org/wiki/PowerShell).

я скопировал код, сохранил его как frontolstart.vbs закачал на кассу и вырубил фронтол. exe (пусть к программе в скрипте поменял с vlc на frontol). Прошло 15 минут - ничего не происходит. »
Для начала стоит запустить frontolstart.vbs, а затем поменять запуск frontol.exe (или что там у Вас) на запуск frontolstart.vbs.

koresaram
28-08-2018, 17:34
Для начала стоит запустить frontolstart.vbs, а затем поменять запуск frontol.exe (или что там у Вас) на запуск frontolstart.vbs. »
то есть я правильно понимаю, что в нашем случае наша вбс будет типа оболочкой вместо винды?

сейчас в настройках самой программы фронтол (это и есть кассовая программа) есть 2 варианта - ос (винда) и фронтол (вместо ос). Туда впихнуть наш вбс не получится я так понимаю. Собственно поэтому я излагал свой вариант - скрипт, чекающий наличие фронтол.екзе и, при его остуствии (вылетел фронтол), предлагающий его запустить .

Iska
28-08-2018, 18:18
то есть я правильно понимаю, что в нашем случае наша вбс будет типа оболочкой вместо винды? »
Неа. Всё, что скрипт делает — сам запускает искомый исполняемый файл. А уж будет или нет оболочкой — это настраивается вовне его.

сейчас в настройках самой программы фронтол (это и есть кассовая программа) есть 2 варианта - ос (винда) и фронтол (вместо ос). »
Смотрели — как именно реализовано «фронтол (вместо ос)»? Подменой стандартного shell'а (Проводника) в реестре? Или каким-то иным особо извращённым хитрым способом?

Туда впихнуть наш вбс не получится я так понимаю. »
Туда — куда?

«ос (винда)» — просто подменяете ярлык на запуск фронтол ярлыком на запуск скрипта. Если ярлык в Автозагрузке — подменяете там. Если путь в автозапуске реестра — подменяете в реестре.

«фронтол (вместо ос)» — открываем оснастку групповой политики, задаём в качестве оболочки пользовательского интерфейса (Custom user interface (https://msdn.microsoft.com/en-us/library/ms811953.aspx)) наш скрипт в виде:
"c:\Windows\System32\wscript.exe" "C:\Мои проекты\0190\0001.vbs"
https://i.imgur.com/FqNLZoH.png

https://i.imgur.com/oLerrfG.png
и пользуемся. Естественно, желательно будет добавить код для выхода из системы (или завершения работы системы) при завершении работы скрипта, дабы люди не терялись при пустом экране. Есть домен — ещё проще, всё делаем в одном месте, есть разделение по OU, фильтрация, предпочтения групповой политики и т.п., назначаем только тем, кому надо. Если домена нет, но ОС от Vista и выше — используем множественную групповую политику (Использование множественной локальной групповой политики (http://www.oszone.net/11365/mlgpo)), не гребя под одну планку пользователей и администраторов машины. В крайнем случае тупо подгружаем куст реестра потребного пользователя, импортируем туда файл реестра с данной политикой, выгружаем куст реестра.

koresaram
28-08-2018, 19:18
Iska,
тут блин фиг знает как реализовано (
в настройках этого фронтола есть галочка )) "Запускать фронтол вместо ОС" - и все. То есть по идее смотреть реестр на автозагрузку надо.

Но. Фишка в чем. Наши "сисадмины" говорят, что подумают как это реализовать ). Думают они уже месяц ) Вот тот код, который я в теме приводил, (мне его подруга написала минут за 5) - если на него сделать ярлык и запихать в "С-Пользователи-Ссылки" - то появляется ярлык вместо избранных ссылок в "Мой компьютер". На него можно нажать и все срабатывает. При этом этот скрипт (приведенный в теме) сисадмины раскидать смогли на все машины, а вот ярлык на этот вбс раскидать на все компы в "С-Пользователи-Ссылки" почему-то нет. Хотя по идее это такой же файл.

Собственно отсюда и "появилась" у меня идея сделать такой скрипт, который сам будет "чекать" на предмет запущенности нужной программы и в зависимости от наличия или отсутствия - выводить окно с возможностью запуска программы.

Iska
28-08-2018, 19:25
в настройках этого фронтола есть галочка )) "Запускать фронтол вместо ОС" - и все. То есть по идее смотреть реестр на автозагрузку надо. »
Или использовать Process Monitor. Я, вот, лично не сильно удивлюсь, если там будет тупо подменяться HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell :o .

а вот ярлык на этот вбс раскидать на все компы в "С-Пользователи-Ссылки" почему-то нет. Хотя по идее это такой же файл. »
Файл-то ярлыка такой же, но кроме ярлыка нужно «раскидать» ещё и сам скрипт, чую — в этом дело :).

Домен у Вас есть?

koresaram
28-08-2018, 19:31
домена наверное нет (это большая локалка. То есть есть айпишники каждой кассы (где-то) :)
сам скрипт раскидан. на всех кассах он есть.
но конкретно ярлык на каждую кассу почему-то не получилось у них ( хотя никаких прав доступа и прочих заморочек там нет (руками я могу зайти в любую кассу - сделать ярлык на этот скрипт и копирнуть его в С/Пользователи/Ссылки и пользователь его начинает видеть и может нажимать.
P>S> если я делаю ярлык на скрипт и копирую его (к примеру) себе на свой комп, то путь к ярлыку меняется на тот,где я положил у себя на компе файл. Может так проще будет - как в ярлыке задать абсолютный путь чтобы ярлык всегда ссылался на D://files/frontol.vbs ? Вне зависимости от того, где лежит сам файл frontol.vbs




© OSzone.net 2001-2012