Как создать, зарегистрировать новую службу Windows из обычного приложения и поставить его в автозагрузку?
У этого приложения будут права администратора?
Отслеживать
13.6k 12 12 золотых знаков 43 43 серебряных знака 72 72 бронзовых знака
задан 2 ноя 2016 в 17:16
Rakzin Roman Rakzin Roman
5,680 11 11 золотых знаков 77 77 серебряных знаков 169 169 бронзовых знаков
Уточните вопрос, вам нужно запустить приложение как службу, или службу из вашего приложения?
3 ноя 2016 в 4:24
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Есть программа обертка для таких целей: https://github.com/kohsuke/winsw По сути она просто запустит приложение с нужными параметрами. При остановке службы опять же запустит его, с другими параметрами. Права у приложения будут LOCAL_SYSTEM, но это можно изменить в свойствах службы.
Отслеживать
ответ дан 2 ноя 2016 в 21:04
313 2 2 серебряных знака 7 7 бронзовых знаков
Что-то она какая-то слишком сложная для этой задачи
3 ноя 2016 в 5:18
Как включить все службы Windows по умолчанию
Можно через консоль, т.е создаешь внутри программы процесс консоли и посылаешь ему что-то типа этого:
Sc create MyService binPath=C:MyServiceMyService.exe DisplayName=″My New Service″ type=own start=auto
Служба так же автоматом добавится в автозапуск.
Еще есть Installutil, но если не ошибаюсь, то у него меньше возможностей чем у SC.
Отслеживать
ответ дан 2 ноя 2016 в 17:50
24.7k 12 12 золотых знаков 61 61 серебряный знак 152 152 бронзовых знака
Эм.. Ну не заработает же? Вроде нельзя взять произвольное приложение и скормить в sc . И почему в коде кавычки наклоные?
2 ноя 2016 в 18:24
А разве в вопросе идет речь про произвольное приложение? Я тело вопроса понял так : Есть приложение и оно должно зарегистрировать другую службу. Как-то двусмысленно трактовать можно.
2 ноя 2016 в 18:28
Хм.. Тогда ok. просто я понял вопрос так: «есть произвольное приложение и я хочу его запустить как службу» 🙂
2 ноя 2016 в 19:51
О, нашёл! Там же написано: «из обычного приложения».
2 ноя 2016 в 19:57
С этой темой есть грязный лайфхак, когда в кач-ве binpath передается, что то вроде «CMD.exe /c /b path_to_exe». Тогда запускается консоль и прежде чем быть грохнутой (ибо не служба) вызовет в безграфическом режиме нужное приложение. К слову работает не у всех, у меня так и не получилось, но множество отзывов положительных слышал о такой методике.
4 ноя 2016 в 13:38
Есть такая программка — XyNtService с исходниками.
Я ее допиливал. Здесь исправленная и улучшенная версия (с исходниками).
На OneDrive — там два файла: XYNTServiceProject_src.zip и XYNTServiceProject_v03.zip
Отслеживать
1,745 9 9 золотых знаков 19 19 серебряных знаков 28 28 бронзовых знаков
ответ дан 3 ноя 2016 в 4:57
dmitry_bond dmitry_bond
129 2 2 бронзовых знака
Произвольное приложение запустить как службу Windows нельзя, оно должно соответствовать требованиям службы.
Можно сделать простую службу, которая будет запускать и контролировать произвольное приложение, указанное в параметрах например. Чтобы не сильно страдать при создании службы, можно воспользоваться, например, TopShelf, который доступен из NuGet, и свести работу к минимуму.
Уроки C# – Создаём свою службу Windows
Права которые будут у службы настраиваются, и могут быть любыми от системных до пользовательских. При необходимости, права могут быть изменены без переустановки службы, но с обязательным перезапуском.
Источник: ru.stackoverflow.com
Запускать любой исполняемый файл как службу Systemd в Linux
Вы когда-нибудь задумывались, как создать службу Linux для управления исполняемыми файлами?
Эта статья изначально была написана в моем личном блоге abhinand5.github.io
Иногда вы можете создать приложение, и по своей природе может быть важно, чтобы оно работало вечно. Например, серверная программа, в которой простои просто недопустимы, или агент, который всегда должен работать в фоновом режиме, не требуя какого-либо ручного вмешательства для запуска, остановки или перезапуска. Есть несколько способов сделать это — держать его работающим вечно. Но в этой статье я расскажу о стандартном Linux-способе сделать это — его также можно использовать в производственной среде. Конечно, я не говорю о (почти) самоуправляемых средах, таких как docker, AWS Lambda, Heroku и т. Д.… Речь пойдет только о простых старых серверах / рабочих столах Linux.
Что такое systemd?
Systemd — это системный менеджер и инструмент инициализации, который стал широко популярным в последние годы. Systemd также является системой инициализации по умолчанию в большинстве известных дистрибутивов Linux. Так что знание того, как создать службу в systemd , может быть не так уж и плохо. Некоторые из популярных дистрибутивов, которые по умолчанию работают на systemd, включают:
- Arch Linux
- Debian Jesse или новее
- CentOS 7 / RHEL 7 или новее
- Ubuntu 16.04 или новее
- Fedora 15 или новее
Основная цель системы инициализации, такой как systemd , — инициализировать компоненты, требующие внимания, после загрузки самого ядра Linux. Но он также предлагает механизм для управления системными службами и демонами, пока система работает, в форме systemctl , что и является тем, что нас интересует. Однако я не собираюсь слишком углубляться в детали того, как работает systemd, это само по себе требует нескольких статей.
Существует множество служб, которые ОС запускает в любой момент, например, служба настройки клавиатуры, которая позволяет использовать клавиатуру с желаемой раскладкой в консоли. Есть несколько из этих сервисов, которые всегда работают в фоновом режиме, чтобы вам было удобнее работать.
Вы можете увидеть список всех сервисов, используя команду ниже
$ systemctl list-units —type=service
Как видно из изображения выше, Postgres или любая другая система управления базами данных также работает в Linux как служба. Вы можете проверить статус любой услуги вот так,
$ systemctl status postgresql

Вы могли заметить, что системные службы заканчиваются расширением .service , это не что иное, как файлы, которые используются для определения службы в systemd . systemctl достаточно умен, чтобы понимать, что вы ищете услугу, и правильно отображать статус, однако вы можете добавить расширение .service в качестве хорошей практики.
Вы можете просмотреть содержимое служебного файла следующим образом:
$ systemctl cat postgresql

Этот файл формально известен как файл модуля, который используется для описания системной службы. Об этом мы поговорим в следующем разделе.
Создание собственного сервиса systemd
Волшебный файл, который позволяет нам создать службу systemd, называется модульным файлом. Я говорю волшебный, потому что его намного проще написать и настроить. Для работающей службы этот файл должен присутствовать только в следующих каталогах
$ man systemd.unit

Это каталоги, из которых systemd будет загружать информацию. В основном нас интересует /etc/systemd/system , где могут находиться системные модули, созданные администратором.
В этой статье я буду использовать простой эхо-сервер, написанный на Python, который я преобразовал в двоичный файл с помощью pyinstaller , чтобы показать вам, как запустить исполняемый файл как службу. В качестве альтернативы мы также увидим, как напрямую запустить файл python из сценария оболочки и превратить его в службу systemd.
Вот простой сервер Python, который я использую,

На данный момент вы можете начать создание файла модуля здесь, а затем, наконец, когда это будет сделано, переместите его в /etc/systemd/system каталог.
Создание юнит-файла с названием вашего сервиса
$ touch echo-server.service
Вы можете редактировать его любым редактором по вашему выбору, я буду использовать редактор inbuilt nano , чтобы не усложнять.
Пилим свою службу Windows – руководство для «не настоящих программистов»

Однажды вы задумаетесь, как превратить скрипт или приложение в Windows-службу. Скорее всего, задача окажется не такой уж тривиальной – приложению как минимум потребуется специальный интерфейс для получения команд от системы. А раз есть требования и ограничения, то есть и скрипты, и милые сердцу костылики для преодоления.
Статья будет полезна тем, кто, как и я — «программист не настоящий».
Зачем нужна служба, если есть назначенные задания
В отличие от назначенных заданий служба работает постоянно, запускается при старте ПК и может управляться средствами Windows. А еще регулярно запускаемому скрипту могут понадобиться данные с предыдущего запуска, и может быть полезно получение данных из внешних источников — например, в случае TCP или Web сервера.
Лично мне за последние пять лет приходилось создавать службу три с половиной раза:
- Потребовалось создать сервис на fail2ban для Windows 2003., который работал с логами FileZilla и Apache, а при подозрении на брутфорс блокировал IP штатными средствами Windows — ipsec.
- Аналог телнет-сервера для домашних версий Windows. Понадобилось выполнять команды на удаленных рабочих станциях, которые были под управлением Windows 7 Home. По сути, вторая попытка поиграть в службы.
- Музыкальный проигрыватель для торгового зала под Windows. Задачу по ТЗ можно было решить при помощи mpd и пачки скриптов, но я решил — если уж делать скрипты, то почему бы и не «сваять» проигрыватель самому. За основу взял библиотеку BASS.dll.
- Когда выбирали веб-сервер с поддержкой загрузки файлов под Windows, одним из вариантов был HFS. Сам по себе работать он не может, поэтому пришлось «запихивать» его в службу. В результате решение не понравилось, и просто установили «тему» Apaxy на web-сервере Apache.
Для создания службы можно использовать взрослые языки программирования вроде C. Но если вы не хотите связываться с Visual Studio, то возьмите готовые утилиты. Существуют платные решения вроде FireDaemon Pro или AlwaysUp, но мы традиционно сосредоточимся на бесплатных.
Способ первый. От Microsoft
Этот уже немолодой механизм состоит из двух компонентов: утилиты instsrv.exe для установки сервиса и srvany.exe — процесса для запуска любых исполняемых файлов. Предположим, что мы создали веб-сервер на PowerShell при помощи модуля Polaris. Скрипт будет предельно прост:
New-PolarisGetRoute -Path ‘/helloworld’ -Scriptblock < $Response.Send(‘Hello World!’) >Start-Polaris -Port 8080 while($true)

Работа так называемого «сервера».
Теперь попробуем превратить скрипт в службу. Для этого скачаем Windows Resource Kit Tools, где будут наши утилиты. Начнем с того, что установим пустой сервис командой:
instsrv WebServ C:temprktoolssrvany.exe
Где WebServ — имя нашего нового сервиса. При необходимости через оснастку services.msc можно задать пользователя, под которым будет запускаться служба, и разрешить взаимодействие с рабочим столом.
Теперь пропишем путь к нашему скрипту при помощи магии реестра. Параметры службы есть в разделе реестра HKLMSYSTEMCurrentControlSetServicesWebServ. В нем нам нужно добавить новый раздел Parameters и создать там строковый параметр Application, указав в нем путь к исполняемому файлу. В случае скрипта PowerShell он будет выглядеть так:
C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:tempPolarisserver.ps1

Настроенная служба.
Можно запустить и радоваться.

Работающая служба.
Однако у этого способа есть недостатки:
- Утилиты старые, разработаны до изобретения PowerShell, UAC и прочих вещей.
- Srvany не контролирует работу приложения. Даже если оно выпадет в ошибку, служба продолжит свое дело как ни в чем не бывало.
- Придется донастраивать и копаться в реестре. Вы же помните, что копаться в реестре небезопасно?
Поэтому перейдем к методу, частично лишенному этих проблем.
Способ второй, почти взрослый
Существует утилита под названием NSSM — Non-Sucking Service Manager, что можно перевести как не-плохой менеджер служб. В отличие от предыдущей, она поддерживается разработчиком, и исходный код опубликован на сайте. Помимо обычного способа, доступна и установка через пакетный менеджер Chocolately.
Создать сервис можно из обычной командной строки, вооружившись документацией на сайте разработчика. Но мы воспользуемся PowerShell. Потому что можем, разумеется.
$nssm = (Get-Command ./nssm).Source $serviceName = ‘WebServ’ $powershell = (Get-Command powershell).Source $scriptPath = ‘C:tempPolarisserver.ps1’ $arguments = ‘-ExecutionPolicy Bypass -NoProfile -File «»‘ -f $scriptPath $nssm status $serviceName Start-Service $serviceName Get-Service $serviceName

Установка через PowerShell.
Для разнообразия проверим работу службы не браузером, а тоже через PowerShell командой Invoke-RestMethod.

И вправду работает.
В отличие от srvany, этот метод позволяет перезапускать приложение на старте, перенаправлять stdin и stdout и многое другое. В частности, если не хочется писать команды в командную строку, то достаточно запустить GUI и ввести необходимые параметры через удобный интерфейс.
GUI запускается командой:
nssm.exe install ServiceName

Настроить можно даже приоритет и использование ядер процессора.
Действительно, возможностей куда больше, чем у srvany и ряда других аналогов. Из минусов бросается в глаза недостаточный контроль над всем процессом.
Налицо нехватка «жести». Поэтому я перейду к самому хардкорному методу из всех опробованных.
Способ третий. AutoIT
Поскольку я давний любитель этого скриптового языка, то не смог пройти мимо библиотеки под названием _Services_UDF v4. Она снабжена богатой документацией и примерами, поэтому под спойлером сразу приведу полный текст получившегося скрипта.
Листинг скрипта
Итак, попробуем «завернуть» в нее наш веб-сервис:
Разберу подробнее момент запуска приложения. Он начинается после операции $bServiceRunning = True и превращается в, казалось бы, бесконечный цикл. На самом деле этот процесс прервется, как только служба получит сигнал о завершении — будь то выход из системы или остановка вручную.
Поскольку программа для скрипта является внешней (powershell.exe), то после выхода из цикла нам нужно закончить ее работу с помощью ProcessClose.
Для этого скрипт необходимо скомпилировать в .exe, а затем установить службу, запустив exe с ключом -i.

Оно работает!
Разумеется, этот способ не самый удобный, и все дополнительные возможности придется реализовывать самостоятельно, будь то повторный запуск приложения при сбое или ротация логов. Но зато он дает полный контроль над происходящим. Да и сделать в итоге можно куда больше — от уведомления в Telegram о сбое службы до IPC-взаимодействия с другими программами. И вдобавок — на скриптовом языке, без установки и изучения Visual Studio.
Расскажите, а вам приходилось превращать скрипты и приложения в службы?
- служба windows
- autoit
- костыль или не совсем
Источник: habr.com