вторник, 9 декабря 2008 г.

Сервисы AutoExNT и SrvAny

Недавно возникла задача автоматизации запуска приложения под ОС Windows Server 2000. Причем приложение состоит из bat-файла, который запускает и перестартовывает exe-файл если тот непредвиденно прекращает работу.
В рамках этой задачи возникла идея организации службы, которая будет при старте системы, даже без логона пользователя запускать приложение. Первое, что пришло в голову - использование InstSrv.exe утилиты.


Вот так выглядит это решение:

Инсталлируем сервис:
instsrv XXX c:\windows\system32\srvany.exe

Редактируем реестр
HKLM\System\CCS\Services\XXX

Создаем тут ветку Parameters
  1. В этой ветке создаем Application REG_SZ %windir%\system32\cmd.exe
  2. В этой ветке создаем AppParameters REG_SZ /c xxx_reload.bat
  3. В этой ветке создаем AppDirectory REG_SZ путь к папке приложения соотв-но
  4. В этой ветке создаем AppEnvironment REG_SZ пусто
Пуск\выполнить\services.msc – находим XXX, ставим тип запуска Auto и запускать от имени предназначенного для этого пользователя.


Вполне работоспособное решение. Положительным моментом данного решения можно считать то, что исполняемым в качестве сервиса файлом может быть не только командный файл, но и исполняемые файлы.

Второй вариант решения, который нам предоставляет Microsoft Resource Kit более подходит для моего варианта. Это использование сервиса AutoExNT. Этот сервис имеет узкоспециализированное значение запуска коммандного AutoExNT.bat файла.

Вариант этого решения выглядит следующим образом:

1. Для работы необходимо на целевую систему скопировать файлы в системную папку %SystemRoot%\System32\ Servmess.dll, Autoexnt.exe, InstExNT.

2. Создаем AutoExNT.bat, который должен исполнятся в качестве службы. В нем то и будет реализована вся необходимая нам функциональность.

3. Инсталируем сервис коммандой:
instexnt install
или
instexnt install /interactive

Отличие этих двух команд заключается в возможности пользователя взаимодействовать с сервисом (останавливать или запускать его).

4. После этого сервису можно дать комментарий в оснастке services.msc и протестировать на запуск/остановку коммандами

net start autoexnt

net stop autoexnt


Вуаля! Получаем контролируемый, выполняемый при загрузке сервиса код.

Комментариев нет: