Страница 1 из 1

Запуск пограммы Windows как службы

Добавлено: 10 фев 2011, 11:53
Raven
Поставил я на виндовый сервак портированный из-под FreeBSD фаерволл IPFW, только вот нарисовалась проблемка - автозапуск фаера с нужными мне правилами. Дефолтовое правило у него deny all, а это сами понимаете - даже по RDP не зацеплюсь. А правила подгружаются посредством cmd-скрипта, так что пришлось искать пути выхода из создавшейся проблемы. В интернете наткнулся на статейку, которая мне сильно помогла, поэтому выкладываю ее сюда на всеобщее обозрение (естественно с моими небольшими изменениями, которые были нужны исходя из моего конфига).

Бывают ситуации, когда надо запустить некую программу как сервис, т.е. обеспечить ее автоматический запуск при загрузке системы, независимо от того – вошел пользователь в систему или нет.
В идеале мы можем создать папку, например:
c:\autorun и помещать в нее bat-файлы, ярлыки и т.д. При этом все это добро будет запускаться при старте системы. Почти как папка Автозагрузка.

Итак... Для начала нам нужны программы SrvAny.exe и InstSrv.exe, входящие в Windows 2k3 Server Resource Kit Tools с сайта Microsoft или тут

Скачиваем и устанавливаем ресурс-кит. Выдергиваем оттуда SrvAny.exe и InstSrv.exe. Далее, для удобства будем считать, что SrvAny.exe и InstSrv.exe лежат у нас в папке c:\autorun\bin. Создаем там же runatsart.bat (пока пустой).
В командной сроке набираем:

Код: Выделить всё

c:\autorun\bin\instsrv RunAtStart c:\autorun\bin\srvany.exe
тем самым, устанавливая SrvAny в качестве сервиса с именем RunAtStart. Можно зайти в список сервисов и убедиться в этом. Дальше... Создаем .reg файл:

Код: Выделить всё

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RunAtStart]
"DisplayName"="RunAtStart"
"Description"="Run custom commands at System Startup"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RunAtStart\Parameters]
"Application"="c:\\windows\\system32\\cmd.exe"
"AppParameters"="/c RunAtStart.bat"
"AppDirectory"="c:\\autorun\\bin"
"AppEnvironment"=""
Обращаем внимание на строку:

Код: Выделить всё

"Application"="c:\\windows\\system32\\cmd.exe"
Для Windows 2000 надо поменять путь c:\\windows на c:\\winnt

Импортируруем созданный файл в реестр. После этого задаем вновь созданному сервису RunAtStart режим запуска Auto.

Теперь время редактировать RunAtStart.bat. Его содержимое примерно такое:

Код: Выделить всё

@echo off 
if %1.==:. goto %2
setlocal
chcp 1251

set log=c:\autorun\logs\RunAtSart.log
set rundir=c:\autorun\run

echo RunAtStart: Running at %date% %time% >>%log%
for %%i in (%rundir%\*.*) do call %0 : do_run "%%~ni" "%%i"
net stop RunAtStart

goto eof
:do_run
echo Run: %~4 >>%log%
start "%~3" "%~4"
goto eof
:eof
Две переменные log и rundir можно изменять, с учетом ваших требований (не забудьте создать соответсствующие каталоги. Все готово. Перезагружаем систему, заглядываем в файл c:\autorun\logs\RunAtSart.log, видим там дату загрузки системы и список запущеных программ. Самих программ на экране мы не видим. И возможности увидеть их у нас нет :(. Максимум что мы можем сделать – увидеть их диспетчере задач и там же завершить их выполнение.

Механизм всего этого такой:

при старте системы запускается сервис RunAtStart (SrvAny.exe)
в свою очередь он запускает, заданную в параметрах (в реестре), команду: c:\windows\cmd.exe /c RunAtStart.bat
RunAtStart.bat запускает все найденные файлы в каталоге c:\autorun\run

Важно! По умолчанию запуск программ происходит от имени пользователя System, поэтому могут быть проблемы с правами, особенно на сетевых дисках.
Этим методом можно запускать программы не выводящие на экран каких либо вопросов, сообщений с приглашением нажать OK и т.п. Из за того, что мы не имеем возможности взаимодействовать с запущеной программой, выдав диалоговой окно с вопросом, она так и будет ждать реакции пользователя... Мы же об этом так и не узнаем. Поэтому, например в bat-файлах, нужно избегать команды pause, часто добавляемой для отладки, и применять вместо нее конструкцию:

Код: Выделить всё

if defined user pause
Однако на время отладки можно включить галочку Allow Sevice Interact With Desktop в настройках сервиса. Это позволит нам видеть окна запущеных программ и взаимодействовать с ними.

Примечание: Удалить установленный сервис можно командой:

Код: Выделить всё

c:\autorun\bin\instsrv RunAtStart remove