- Службы Windows
- Создание службы для Windows
- Статья Создание службы в Windows
- Dragokas
- Dragokas
- Могу ли я создать службу Windows и как это сделать?
- Что мне нужно для создания службы Windows?
- Что такое менеджер службы без присасывания?
- Создание службы Windows с помощью NSSM
- Удаление службы Windows с помощью NSSM
Службы Windows
Создание службы для Windows
Одним из важнейших компонентов ОС Windows являются службы. Фактически это отдельные приложения, которые не имеют графического интерфейса и которые выполняют различные задачи в фоновом режиме. Службы могут быть запущены при старте операционной системы, так и в любой другой момент работы пользователя. Распространенным примером служб являются различные веб-серверы, которые в фоновом режиме прослушивают определенный порт на наличие подключений, и если подключения имеются, то взаимодействуют с ними. Это могут быть также различные вспомогательные сервисы обновлений для других установленных программ, которые обращаются к серверу, чтобы узнать, есть ли новая версия приложения. В общем то мы можем открыть панель служб и сами увидеть все установленные и запущенные службы:
Рассмотрим, как создавать свои службы в C#. В качестве реализуемой задачи выберем наблюдение за изменениями в определенной папке в файловой системе. Теперь создадим для ее выполнения службу.
Вначале создадим новый проект, который будет иметь тип Windows Service . Назовем проект FileWatcherService:
После этого Visual Studio генерирует проект, который имеет все необходимое. Хотя в принципе нам необязательно выбирать именно этот тип проекта, можно было бы создать проект библиотеки классов, и затем в нем определить все необходимые классы.
Итак, новый проект выглядит следующим образом:
Здесь также есть файл Program.cs и есть собственно узел службы Service1.cs .
Служба представляет обычное приложение, но она не запускаетс сама по себе. Все вызовы и обращения к ней проходят через менеджер управления службами (Service Control Manager или SCM). Когда служба запускается автоматически при старте системы или вручную, то SCM обращается к методу Main в классе Program:
Метод Main по умолчанию определен таким образом, чтобы запускать сразу несколько служб, которые определены в массиве ServicesToRun. Однако по умолчанию проект содержит только одну службу Service1. Сам запуск производится с помощью метода Run: ServiceBase.Run(ServicesToRun) .
Сама запускаемая служба представлена узлом Service1.cs. Однако на самом деле это не простой файл кода. Если мы откроем этот узел, то увидим в нем файл дизайнера службы Service1.Designer.cs и класс Service1.
Класс Service1 собственно представляет службу. По умолчанию он имеет следующий код:
Класс службы должен наследоваться от базового класса ServiceBase . Этот класс определяет ряд методов, важнейшие из которых метод OnStart() , который запускает действия, выпоняемые службой, и метод OnStop() , останавливающий службу.
После того, как SCM вызовет метод Main и зарегистрирует службу, происходит непосредственный ее вызов через запуск метода OnStart.
Когда в консоли служб или через командную строку мы посылаем команду на остановку службы, то SCM обращается к методу OnStop для ее остановки.
Кроме этих двух методов в классе службы можно переопределить еще несколько методов базового класса ServiceBase:
OnPause : вызывается при приостановке службы
OnContinue : вызывается при возобновлении работы службы после ее приостановки
OnShutdown : вызывается при завершении работы Windows
OnPowerEvent : вызывается при изменении режима электропитания
OnCustomCommand : вызывается при получении службой пользовательской команды от Менеджера Управления Службами (Service Control Manager / SCM)
В конструкторе класса Service1 вызывается метод InitializeComponent() , который определен в файле дизайнера Service1.Designer.cs:
Единственное, что надо в нем отметить, это установка названия службы (свойство ServiceName):
Это то название, которое будет отображаться в консоли служб после установки данной службы. Мы можем его изменить, а можем и оставить как есть.
Теперь изменим код службы следующим образом:
Ключевым классом, который инкапсулирует всю функциональность, является класс Logger. С помощью объекта FileSystemWatcher он будет вести мониторинг изменений в папке D://Temp. В методе Start() устанавливается, что мы будем отслеживать изменения через объект FileSystemWatcher. И вся работа будет идти, пока булевая переменная enabled равна true . А метод Stop() позволит завершить работу класса.
События FileSystemWatcher позволяют отслеживать все изменения в наблюдаемой папке. При этом будет вестись запись изменений в файл templog.txt. Чтобы не было гонки ресурсов за файл templog.txt, в который вносятся записи об изменениях, процедура записи блокируется заглушкой lock(obj) .
В итоге после создания, изменения, переименования и удаления файл лога будет содержать что-то наподобие:
В самом классе службы Service1 в конструкторе устанавливается ряд опций:
В методе OnStart() для запуска объекта Logger вызывется новый поток:
Новый поток нужен, так как текущий поток обрабатывает только команды SCM и должен возвращаться из метода OnStart как можно быстрее.
Когда от менеджера SCM поступает команда на остановку службы, срабатывает метод OnStop, который вызывает метод logger.Stop() . Дополнительная задержка позволит потоку логгера остановиться:
Однако самого класса службы еще недостаточно. Нам необходимо еще создать устанощик службы.
Статья Создание службы в Windows
Dragokas
Very kind Developer
Иногда может потребоваться взять исполняемый файл и зарегистрировать его в качестве службы Windows.
Для этого есть несколько способов, я обычно пользуюсь двумя из них.
Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами — просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.
При создании службы с помощью SC нет необходимости вручную создавать записи в реестре и затем перезагружать компьютер, чтобы обеспечить обновление базы данных диспетчером служб. Также SC позволяет указать имя удаленного компьютера, что дает возможность управлять службами как на локальном, так и на удаленном компьютере.
Для создания нового сервиса запускаем команду Sc create. Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:
ServiceName — указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath — указывает путь к исполняемому файлу службы.
Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:
Затем откроем оснастку «Services» и посмотрим результат.
Изменять параметры уже созданной службы можно командой Sc config. Например, мне не понравилось отображаемое имя службы и я хочу его изменить:
PowerShell может почти все, в том числе и управлять службами Windows. Создать новую службу можно с помощью командлета New-Service. Создадим такой же сервис, как и в предыдущем примере, только добавим к нему описание (Description):
В принципе PowerShell имеет примерно такой же функционал как и Sc.exe, разве что позволяет добавить описание. А вот для удаления служб в PS простого способа нет, придется воспользоваться вот такой конструкцией:
Dragokas
Very kind Developer
Можно ли запустить клиентское приложение в качестве службы? В одной из статей я описывал способы создания службы 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) и вводим команду
которая открывает окно графического инсталлятора NSSM. Чтобы создать службу, достаточно в поле Path указать путь к исполняемому файлу и нажать кнопку «Install service». Дополнительно в поле Options можно указать ключи, необходимые для запуска службы.
Также на этапе создания новой службы можно указать некоторые дополнительные параметры.
На вкладке «Shutdown» перечислены методы остановки и таймауты, используемые при штатном завершении работы или аварийной остановке приложения. Когда NSSM получает команду остановки (напр. при завершении работы приложения), то он пытается остановить контролируемое приложение штатным образом. Если же приложение не отвечает, то NSSM может принудительно завершить все процессы и подпроцессы этого приложения.
Всего есть четыре этапа завершения работы приложения, и по умолчанию они будет использоваться в таком порядке:
• На первом этапе NSSM пытается сгенерировать и отправить событие Ctrl+C. Этот способ хорошо работает для консольных приложений или скриптов, но не применим для графических приложений;
• Затем NSSM определяет все окна, созданные приложением, и посылает им сообщение WM_CLOSE, инициирующее выход из приложения;
• Третьим этапом NSSM вычисляет все потоки, созданные приложением, и отправляет им сообщение WM_QUIT, которое будет получено если приложение имеет очередь сообщений потока;
• И в качестве последнего средства NSSM может вызвать метод TerminateProcess(), принудительно завершив работу приложения.
Возможно отключить некоторые или даже все методы, однако для разных приложений срабатывают разные методы и для корректного завершения работы приложения рекомендуется оставить все как есть.
По умолчанию при падении службы NSSM пытается рестартовать ее. На вкладке «Exit actions» можно изменить автоматическое действие при нештатном завершении работы приложения, а также выставить задержку перед автоматическим перезапуском приложения.
На вкладке «Input/Output (I/O)» можно задать перенаправление ввода\вывода приложения в указанный файл.
На вкладке «Environment» можно задать для службы новые переменные окружения, или переопределить существующие.
Также можно не пользоваться графической оболочкой и сразу создать службу в консоли такой командой:
После создания службы с помощью NSSM зайдем в оснастку Services и найдем службу notepad. Как видите, с виду она ничем не отличается от остальных служб, мы также можем ее запустить, остановить или изменить режим запуска. Однако обратите внимание, что в качестве исполняемого файла указан nssm.exe.
А если зайти в Task Manager, то мы увидим следующую картину: в качестве основного (родительского) процесса запущен NSSM, служба notepad запущена как его дочерний процесс, и уже в этом дочернем процессе запущено приложение Блокнот.
Для удаления службы вводим команду nssm remove notepad и подтверждаем ее удаление. А введя команду
Могу ли я создать службу Windows и как это сделать?
Иногда вам нужно приложение или скрипт, чтобы продолжать работать вне зависимости от того, авторизованы вы на своем компьютере или нет. Может быть, это сценарий PowerShell для мониторинга портов или веб-сервер, на котором размещена страница в вашей домашней сети.
Дело в том, что если вы хотите, чтобы процесс, сценарий или программа выполнялись, пока компьютер включен, вам необходимо создать службу Windows.
Что мне нужно для создания службы Windows?
Чтобы создать службу Windows в Windows 10, необходимо выполнить несколько предварительных условий:
- Доступ администратора на компьютере
- Что-то для запуска в качестве службы (сценарий PowerShell, программа и т.д.)
- Установлен Non-Sucking Service Manager (NSSM)
Что такое менеджер службы без присасывания?
Да, вы не можете отказаться от такого имени, не объяснив его. Конечно, название неудачное, но оно точное. Диспетчер служб Non-Sucking (NSSM), пожалуй, самый простой способ создать службу Windows, которая будет одновременно высоконадежной и настраиваемой. Кроме того, это бесплатное программное обеспечение с открытым исходным кодом (OSS).
NSSM можно использовать через командную строку Windows или графический интерфейс пользователя (GUI). Это означает, что им может пользоваться каждый. NSSM можно использовать в любой версии Windows, начиная с Windows 2000 включительно. Существуют 32-битные и 64-битные версии. Если вы используете 64-битный компьютер, сначала попробуйте эту версию. Если это не сработает, вернитесь к 32-битной версии.
Вы можете скачать NSSM с веб-сайта, клонировать NSSM из Git или установить NSSM с помощью Chocolatey. Chocolatey — это менеджер пакетов для Windows. Способы установки будут зависеть от выбранного вами маршрута. См. Инструкции NSSM. В нашем примере мы загружаем с веб-сайта NSSM и устанавливаем его в C:\WINDOWS\system32 .
Создание службы Windows с помощью NSSM
В этом примере мы создадим службу из сценария PowerShell для регистрации среднего процента загрузки ЦП.
- Скопируйте и сохраните этот сценарий как log-CPULoadPercentage.ps1 в месте, которое вряд ли будет доступно для кого-либо еще. Попробуйте создать каталог C:/Scripts и сохранить его там. Кроме того, создайте папку в скриптах под названием Logs. Обратите внимание, что путь к сценарию — C:/Scripts/log-CPULoadPercentage.ps1 . Это понадобится вам позже.
Примечание. Все строки ниже, за которыми следует символ #, являются комментариями и не влияют на сценарий.
- Это можно сделать либо в командной строке Windows, либо в PowerShell. Откройте его как администратор.
- Введите команду nssm install logCPUAvg и запустите ее. Откроется окно установщика службы NSSM.
- Нажмите кнопку с многоточием рядом с полем «Путь:» и перейдите к файлу powershell.exe, который обычно находится в папке C:\Windows\System32\ . Выберите powershell.exe. Путь: и каталог запуска: поля будут автоматически заполнены.
- Введите следующее в Arguments: поле: -ExecutionPolicy Bypass -NoProfile -File «C:\PathToScript\get-Script.ps1» , где последняя часть является путь к PowerShell сценария и имени сценария.
- Выберите вкладку Details. Введите то, что вы хотите, чтобы служба отображалась, как в диспетчере служб Windows, в поле Отображаемое имя:. Затем введите, что он делает, в поле Описание:. Тип запуска: может быть установлен как автоматический, автоматический (отложенный запуск), ручной или отключенный. Для этого упражнения подходит автоматический режим.
- Выберите вкладку Вход в систему. Установите переключатель «Эта учетная запись:» и введите учетную запись и пароль, от имени которых будет работать служба. Вам нужно будет выбрать учетную запись, под которой будет работать служба. В идеале у вас должна быть учетная запись Windows, созданная только для запуска этой службы. Разрешения этой учетной записи должны быть ограничены только тем, что нужно делать службе. Вы можете выбрать локальную системную учетную запись , но это не рекомендуется по соображениям безопасности.
Есть несколько других вкладок, которые можно использовать для настройки службы. Для этого упражнения достаточно значений по умолчанию на этих вкладках. Нажмите кнопку Установить службу.
- Когда служба будет установлена, вы увидите, что служба «logCPUAvg» успешно установлена! окно. Выберите ОК, чтобы закрыть его. На этом установка завершена.
- Откройте диспетчер служб Windows и убедитесь, что служба существует.
- Запустите службу, чтобы убедиться, что она будет работать.
- Чтобы убедиться, что эта служба запущена, с помощью проводника перейдите туда, где предполагается сохранить журнал, и проверьте, существует ли он.
Удаление службы Windows с помощью NSSM
Возможно, вам больше не нужно следить за загрузкой процессора, поэтому вы хотите избавиться от службы. К счастью, NSSM упрощает это.
- В диспетчере служб Windows остановите службу. Сделайте это, выбрав службу «Журнал средней загрузки ЦП», а затем либо нажав квадратную кнопку остановки на панели инструментов, либо ссылку «Остановить службу» слева.
- Откройте командную строку Windows или PowerShell от имени администратора.
- Введите команду nssm remove logCPUAvg и выполните команду.
- NSSM попросит вас подтвердить. Выберите Да .
- Когда служба будет удалена, вы увидите, что служба «logCPUAvg» успешно удалена! Подтверждение. Выберите ОК, и все готово.
Вот и все. Рекомендуется проверить диспетчер служб, чтобы убедиться, что службы больше нет. Если вы все еще видите службу, возможно, вам нужно обновить экран, и он должен исчезнуть.
Службы — отличный способ запускать приложения или скрипты, которые должны запускаться постоянно, перезапускаться в случае сбоя или требовать привилегий, отличных от текущего пользователя. Если вам не нужно ваше приложение или сценарий для выполнения всех этих задач, рассмотрите возможность использования запланированной задачи.