У меня есть виртуальная машина Windows 2008 R2, на которой работает сторонняя система ERP. У них есть утилита, которая будет запускать запланированные задания для резервного копирования базы данных Oracle и данных приложений каждую ночь с 7-дневной ротацией.
Проблема в том, что оно должно запускаться как настольное приложение в интерактивном режиме в рамках сеанса. Он не может работать как служба. Хотя я не в восторге от того, что оставляю учетную запись без входа в систему, я научился это разрешать. Основная проблема здесь заключается в том, что если сервер перезагружается, могут пройти дни, прежде чем я пойму, что учетная запись больше не входит на сервер с открытым приложением.
Могу ли (и если да, то как) создать задачу, которая запускается при запуске, которая регистрирует пользователя на виртуальной машине (создает сеанс) и запускает приложение на рабочем столе этого сеанса?
ИЛИ
Если это слишком сложно или невозможно, у кого-нибудь есть идеи, как проверить, работает ли это приложение в сеансе этой учетной записи, и не отправить ли оно предупреждение? Я нормально отношусь даже к ошибке пользовательского журнала событий, так как могу обнаружить ее с помощью удаленного мониторинга.
Я предполагаю, что программа должна отображать свой пользовательский интерфейс и что вы не можете просто запустить ее в неинтерактивном режиме. (Я люблю эти "жемчужины" программного обеспечения ...)
Вот что я бы сделал лично:
Настройте серверный компьютер с AutoAdminLogon
как пользователь, от имени которого вы хотите запускать приложение. Это заставит консоль сервера автоматически войти в систему как этот пользователь при загрузке.
Добавьте сценарий в личную группу «Запуск» пользователя автолога, который запускает задачу асинхронно, отслеживает список процессов для присутствующей задачи (я бы использовал WMIC PROCESS LIST
, лично), предупредить, если задача пропала из списка процессов, и, при желании, перезапустить процесс. Я бы тоже заблокировал рабочую станцию.
Сценарий в группе запуска может быть таким простым, как (вызов программы, которую нужно запустить eqalert.exe
):
@echo off
:restart
start "" "C:\Program Files\EQFU\EQWin32\eqalert.exe"
:check_loop
rem Delay 30 seconds between checks
ping -n 30 127.0.0.1 >NUL 2>NUL
wmic process list | find /i "eqalert.exe" >NUL 2>NUL
if not errorlevel 1 goto check_loop
echo eqalert.exe not running - restarting
eventcreate /T ERROR /ID 1 /L APPLICATION /D "eqalert.exe not running - restarting"
goto restart
Этот сценарий предполагает, что будет только один экземпляр задачи, и только проверяет наличие задачи в списке процессов. Если процесс зависает или умирает, этот скрипт этого не поймает. (Мониторинг того, "реагирует ли" программа на Windows, т.е. если ее насос сообщений все еще ... эээ ... качает, - более сложная перспектива.)
Во-первых, вы уверены, что вам действительно нужен интерактивный сеанс? Скорее всего, вы действительно сможете запустить его внутри запланированной задачи, если настроите его свойство.
Теперь, предполагая, что это невозможно / практично / разрешено:
Вы можете настроить свою виртуальную машину на автоматический вход пользователя. Процесс описан Вот но вот основные моменты:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
в regeditand
Defaultpassword`AutoAdminLogon
запись и установите для нее 1
(в качестве альтернативы вы можете просто скачать и использовать AutoLogon)
Я уверен, что вы видите здесь потенциальную проблему, поэтому я не буду вдаваться в подробности.
Ваш второй запрос довольно легко выполнить с помощью пакета. Вот образец, который использует блат:
tasklist | find "myprocess.exe"
if %ERRORLEVEL%==1 blat tasknotrunning.txt -to admin@domain.com
Если вместо этого вы хотите использовать журнал событий, вы можете использовать встроенный событие команда вроде этой:
tasklist | find "myprocess.exe"
if %ERRORLEVEL%==1 eventcreate.exe /L APPLICATION /ID 911 /D “task XXX is not running” /T INFORMATION
(Я выбрал 911 в качестве идентификатора события, но вы можете использовать все, что считаете нужным, если это не конфликтует с чем-то другим).
У них есть утилита, которая будет запускать запланированные задания для резервного копирования базы данных Oracle и данных приложений.
Если это все, что делает задача, есть другие способы резервного копирования базы данных Oracle. Вы также упомянули другие данные приложения, но я ожидаю, что их также можно будет записать отдельно. Вы изучали, могут ли более общие инструменты резервного копирования, такие как BackUp Exec, Barracuda, Acronis и т. Д., Которые вы, возможно, уже используете для других служб, достичь той же цели? Похоже, этот инструмент предназначен для небольших клиентов, у которых иначе не было бы настоящего решения для резервного копирования.