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

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

----------------------<cut>----------------------

Итак... Для начала нам нужны программы 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=%temp%\RunAtSart.log
set rundir=c:\autorun

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 можно изменять. Все готово. Перезагружаем систему, заглядываем в файл %temp%\RunAtSart.log, видим там дату загрузки системы и список запущеных программ. Самих программ на экране мы не видим. И возможности увидеть их у нас нет :(. Максимум что мы можем сделать – увидеть их диспетчере задач и там же завершить их выполнение.

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

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

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

Примечание: Удалить установленный сервис можно командой:
c:\autorun\bin\instsrv RunAtStart remove

Все перечисленные выше файлы лежат здесь. Распаковывать на диск C: Абсолютные пути в файлах можно отредактировать в соответствии с тем каталогом, где все это будет лежать.