Статья Создание службы в Windows

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Dragokas, 21 фев 2014.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.309
    Создание службы в Windows
    Иногда может потребоваться взять исполняемый файл и зарегистрировать его в качестве службы Windows.
    Для этого есть несколько способов, я обычно пользуюсь двумя из них.

    Sc.exe

    Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами — просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.

    При создании службы с помощью SC нет необходимости вручную создавать записи в реестре и затем перезагружать компьютер, чтобы обеспечить обновление базы данных диспетчером служб. Также SC позволяет указать имя удаленного компьютера, что дает возможность управлять службами как на локальном, так и на удаленном компьютере.

    Для создания нового сервиса запускаем команду Sc create. Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:
    Код (DOS):
    sc create [ServiceName] [binPath= ] <параметр1= > <параметр2= >
    ServiceName — указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
    binPath — указывает путь к исполняемому файлу службы.

    Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:
    Код (DOS):
    Sc create MyService binPath=C:\MyService\MyService.exe DisplayName=″My New Service″ type=own start=auto
    Затем откроем оснастку «Services» и посмотрим результат.

    sc1.png

    Изменять параметры уже созданной службы можно командой Sc config. Например, мне не понравилось отображаемое имя службы и я хочу его изменить:
    Код (DOS):
    Sc config MyService DisplayName="My Service"
    Ну и полностью удалить службу можно вот так:
    Код (DOS):
    Sc delete MyService
    sc2.png


    PowerShell

    PowerShell может почти все, в том числе и управлять службами Windows. Создать новую службу можно с помощью командлета New-Service. Создадим такой же сервис, как и в предыдущем примере, только добавим к нему описание (Description):
    Код (PowerShell):
    New-Service -Name MyService -BinaryPathName C:\MyService\MyService.exe` -DisplayName "My New Service" -Description "Very Important Service !!!"
    Изменить параметры службы можно командлетом Set-Service:
    Код (PowerShell):
    Set-Service -Name MyService -Description "Not Very Important Service" -StartupType Manual
    sc4.png

    В принципе PowerShell имеет примерно такой же функционал как и Sc.exe, разве что позволяет добавить описание. А вот для удаления служб в PS простого способа нет, придется воспользоваться вот такой конструкцией:
    Код (PowerShell):
    (Get-WmiObject win32_service -Filter "name=`MyService`").delete()
    Поэтому лично я предпочитаю использовать Sc.exe.
     
    Последнее редактирование: 21 фев 2014
    sov44, orderman и Kиpилл нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.309
    Как запустить приложение в виде службы Windows


    Можно ли запустить клиентское приложение в качестве службы? В одной из статей я описывал способы создания службы Windows штатными средствами ОС. Однако не каждое консольное приложение сможет запуститься как служба, а программы с графическим интерфейсом в принципе не умеют работать подобным образом. Но возможность запустить приложение как службу все же есть, и поможет нам в этом программа с оригинальным названием Non-Sucking Service Manager.

    NSSM представляет из себя свободное программное обеспечение с открытым кодом и поддерживает все операционные системы Microsoft, начиная с Windows 2000 и заканчивая Windows 8. NSSM не требует установки, достаточно его загрузить и распаковать. В дистрибутив входят версии для 32- и 64-разрядных ОС. Взять программу можно с сайта nssm.cc, на данный момент последняя стабильная версия 2.21.1, которую я и буду использовать.
    Для демонстрации возможностей NSSM попробуем запустить Блокнот Windows в качестве службы на Windows 8.1.

    Создание службы

    Для создания службы с именем notepad запускаем командную консоль, переходим в папку с распакованным NSSM (для 64-разрядной Windows) и вводим команду
    Код (Text):
    nssm install notepad
    которая открывает окно графического инсталлятора NSSM. Чтобы создать службу, достаточно в поле Path указать путь к исполняемому файлу и нажать кнопку «Install service». Дополнительно в поле Options можно указать ключи, необходимые для запуска службы.

    nssm1.png

    Также на этапе создания новой службы можно указать некоторые дополнительные параметры.

    На вкладке «Shutdown» перечислены методы остановки и таймауты, используемые при штатном завершении работы или аварийной остановке приложения. Когда NSSM получает команду остановки (напр. при завершении работы приложения), то он пытается остановить контролируемое приложение штатным образом. Если же приложение не отвечает, то NSSM может принудительно завершить все процессы и подпроцессы этого приложения.

    Всего есть четыре этапа завершения работы приложения, и по умолчанию они будет использоваться в таком порядке:

    • На первом этапе NSSM пытается сгенерировать и отправить событие Ctrl+C. Этот способ хорошо работает для консольных приложений или скриптов, но не применим для графических приложений;
    • Затем NSSM определяет все окна, созданные приложением, и посылает им сообщение WM_CLOSE, инициирующее выход из приложения;
    • Третьим этапом NSSM вычисляет все потоки, созданные приложением, и отправляет им сообщение WM_QUIT, которое будет получено если приложение имеет очередь сообщений потока;
    • И в качестве последнего средства NSSM может вызвать метод TerminateProcess(), принудительно завершив работу приложения.

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

    nssm2.png

    По умолчанию при падении службы NSSM пытается рестартовать ее. На вкладке «Exit actions» можно изменить автоматическое действие при нештатном завершении работы приложения, а также выставить задержку перед автоматическим перезапуском приложения.

    nssm3.png

    На вкладке «Input/Output (I/O)» можно задать перенаправление ввода\вывода приложения в указанный файл.

    nssm4.png

    На вкладке «Environment» можно задать для службы новые переменные окружения, или переопределить существующие.

    nssm5.png

    Также можно не пользоваться графической оболочкой и сразу создать службу в консоли такой командой:
    Код (Text):
    nssm install notepad "C:\Windows\system32\notepad.exe"
    Управление службой

    После создания службы с помощью NSSM зайдем в оснастку Services и найдем службу notepad. Как видите, с виду она ничем не отличается от остальных служб, мы также можем ее запустить, остановить или изменить режим запуска. Однако обратите внимание, что в качестве исполняемого файла указан nssm.exe.

    nssm6.png

    А если зайти в Task Manager, то мы увидим следующую картину: в качестве основного (родительского) процесса запущен NSSM, служба notepad запущена как его дочерний процесс, и уже в этом дочернем процессе запущено приложение Блокнот.

    nssm7.png


    Удаление службы

    Для удаления службы вводим команду nssm remove notepad и подтверждаем ее удаление. А введя команду
    Код (Text):
    nssm remove notepad confirm
    можно обойтись и без подтверждения.

    nssm8.png
     
    Последнее редактирование: 22 фев 2014
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.309
    Запуск службы в интерактивном режиме


    Основное отличие пользовательского приложения от службы заключается в том, что после запуска приложение может требовать для продолжения работы дополнительных действий со стороны пользователя — например нажать кнопку или ввести команду. Для этого необходимо получить к нему доступ, что как оказывается, не так-то просто сделать.

    Для того, чтобы запустить службу в интерактивном режиме, надо в оснастке Службы открыть ее свойства и на вкладке «Вход в систему» отметить чекбокс «Разрешить взаимодействие с рабочим столом».

    nssm9.png

    А дальше начинаются чудеса :) Для службы, запущенной в интерактивном режиме, система открывает отдельный изолированный сеанс (session 0). Попасть в этот сеанс можно только при помощи Службы обнаружения интерактивных служб (ui0detect), которая отслеживает запуск интерактивных служб на компьютере и выдает оповещение. В Windows 7\Server 2008 эта служба активна по умолчанию, а в Windows 8\Server 2012 она отключена и не отображается в графической оснастке Службы (по крайней мере я ее там не нашел). Более того, если вы все же найдете эту таинственную службу и попробуете ее запустить, то получите сообщение об ошибке.

    А дело в том, что для ее запуска необходимо разрешить запуск интерактивных служб на компьютере. Поэтому открываем редактор реестра, находим в разделе HKLM\System\CurrentControlSet\Control\Windows параметр типа DWORD с именем NoInteractiveServices и ставим его значение в 0.

    nssm10.png

    После чего открываем консоль PowerShell и стартуем службу обнаружения командой:
    Код (Text):
    Start-Service -Name ui0detect
    nssm11.png

    Убедившись что служба обнаружения запущена, рестартуем службу notepad, и получаем вот такое окошко. Выбираем пункт «Посмотреть сообщение»

    nssm12.png

    и попадаем в нулевой сеанс, в котором работает наше приложение. Дальше производим с ним необходимые действия и возвращаемся обратно.

    nssm13.png

    Такое вот интересное решение для запуска приложений в виде служб Windows. Не самое красивое, но вполне соответствующее своему названию :)
     
    Последнее редактирование: 22 фев 2014
    orderman и Kиpилл нравится это.

Поделиться этой страницей