Запуск пограммы Windows как службы
Добавлено: 10 фев 2011, 11:53
Бывают ситуации, когда надо запустить некую программу как сервис, т.е. обеспечить ее автоматический запуск при загрузке системы, независимо от того – вошел пользователь в систему или нет.
В идеале мы можем создать папку, например:
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
Код: Выделить всё
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"
Импортируруем созданный файл в реестр. После этого задаем вновь созданному сервису 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
Механизм всего этого такой:
при старте системы запускается сервис RunAtStart (SrvAny.exe)
в свою очередь он запускает, заданную в параметрах (в реестре), команду: c:\windows\cmd.exe /c RunAtStart.bat
RunAtStart.bat запускает все найденные файлы в каталоге c:\autorun\run
Важно! По умолчанию запуск программ происходит от имени пользователя System, поэтому могут быть проблемы с правами, особенно на сетевых дисках.
Этим методом можно запускать программы не выводящие на экран каких либо вопросов, сообщений с приглашением нажать OK и т.п. Из за того, что мы не имеем возможности взаимодействовать с запущеной программой, выдав диалоговой окно с вопросом, она так и будет ждать реакции пользователя... Мы же об этом так и не узнаем. Поэтому, например в bat-файлах, нужно избегать команды pause, часто добавляемой для отладки, и применять вместо нее конструкцию:
Код: Выделить всё
if defined user pause
Примечание: Удалить установленный сервис можно командой:
Код: Выделить всё
c:\autorun\bin\instsrv RunAtStart remove