Пишем службу для windows

Службы 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):

Читайте также:  Windows 10 для телефонов когда выйдет

Это то название, которое будет отображаться в консоли служб после установки данной службы. Мы можем его изменить, а можем и оставить как есть.

Теперь изменим код службы следующим образом:

Ключевым классом, который инкапсулирует всю функциональность, является класс 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() . Дополнительная задержка позволит потоку логгера остановиться:

Однако самого класса службы еще недостаточно. Нам необходимо еще создать устанощик службы.

Создание на C# службы Windows в Visual Studio 2015

Хочу описать процесс создание и тестирования службы Windows на C#. В качестве среды разработки буду использовать Visual Studio 2015. В качестве примера создам службу, которая пишет в файл данные о событиях. Исходный код проекта доступен на GitHub.

Для создания службы я создаю решение с тремя проектами:

Приложение Windows Forms

Создание новой службы начинается, с создания windows приложения (шаблон проекта «Приложение Windows Forms»). Оно нам понадобится для тестирования службы. Приложение будет состоять из одной формы:

Разработка логики

На втором этапе создается проект «Библиотека классов». Именно здесь создаются классы описывающие логику работы будущей службы. Выделение логики в библиотеку классов позволяют нам пока не думать о реализации службы, а вести разработка стандартной windows программы. Плюсом такого подхода является: простота тестирования, легкость повторного использования кода, возможность создания автоматических тестов. В данном примере в библиотеке классов мы создадим только один класс:

Для тестирования — используем приложение созданное на первом этапе.

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

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

Не забываем вставлять ссылку на библиотеку классов. Настраиваем установку службы.

Тестирование службы

Для финального тестирования возвращаемся к приложению Windows Form. Добавляем в него ссылку на созданную службу и создаем новый класс производный от класса описывающего созданную службу:

Создание этого класса позволяет нам вызывать методы службы из диалогового окна нашего приложения. Для примера — эмуляция старта службы:

После тестирования — можно разворачивать нашу службу.

Особенности служб Windows

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

Читайте также:  Скриншот экрана python linux

Ссылки

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

Разработка приложений службы Windows Develop Windows service apps

С помощью Visual Studio или пакета SDK для .NET Framework можно легко создавать службы. Просто создайте приложение, которое устанавливается как служба. Using Visual Studio or the .NET Framework SDK, you can easily create services by creating an application that is installed as a service. Такие приложения называются службами Windows. This type of application is called a Windows service. Используя компоненты платформы, можно создавать, устанавливать, запускать, останавливать и администрировать службы. With framework features, you can create services, install them, and start, stop, and otherwise control their behavior.

В Visual Studio можно создать службы с помощью управляемого кода на Visual C# или Visual Basic, который при необходимости может взаимодействовать с существующим кодом C++. In Visual Studio you can create a service in managed code in Visual C# or Visual Basic, which can interoperate with existing C++ code if required. Или можно создать службу Windows на машинном языке C++ с помощью мастера проектов ATL. Or, you can create a Windows service in native C++ by using the ATL Project Wizard.

Содержание раздела In this section

Сведения о приложениях служб Windows, времени существования служб и отличиях приложений служб от распространенных типов проектов. Provides an overview of Windows service applications, the lifetime of a service, and how service applications differ from other common project types.

Пример создания службы на Visual Basic и Visual C#. Provides an example of creating a service in Visual Basic and Visual C#.

Описание элементов языка, используемых при создании служб. Explains the language elements used in service programming.

Создание и настройка служб Windows с помощью шаблона проекта службы Windows. Describes the process of creating and configuring Windows services using the Windows service project template.

ServiceBase — описываются основные характеристики класса ServiceBase, который используется для создания служб. ServiceBase — Describes the major features of the ServiceBase class, which is used to create services.

ServiceProcessInstaller — описываются возможности класса ServiceProcessInstaller, который используется вместе с классом ServiceInstaller для установки и удаления службы. ServiceProcessInstaller — Describes the features of the ServiceProcessInstaller class, which is used along with the ServiceInstaller class to install and uninstall your services.

ServiceInstaller — описываются возможности класса ServiceInstaller, который используется вместе с классом ServiceProcessInstaller для установки и удаления службы. ServiceInstaller — Describes the features of the ServiceInstaller class, which is used along with the ServiceProcessInstaller class to install and uninstall your service.

Create Projects from Templates (Создание проектов на основе шаблонов) — описываются типы проектов, которые используются в этом разделе, и способ их выбора. Create Projects from Templates — Describes the projects types used in this chapter and how to choose between them.

Служба Windows (Windows Service) создание С++

Перейду сразу к делу и постараюсь описать задачу. Необходимо создать Службу Windows (Windows Service).
Ранее передо мной стояла такая задача. Для ее реализации целиком и полностью использовал средства языка C#.
Т.е. создал службу, создал библиотеку, которую и запускала и останавливала эта служба, все там работало хорошо.

Читайте также:  Linux как открыть файл через текстовый редактор

Что же теперь, задача на C++ (знаком с ним хуже, чем с C#). Необходимо создать службу, которая точно также будет крутиться на Windows, но библиотека, которую и запускает и останавливает эта должна быть написана на С++.

Ход мыслей таков, что необходим создать проект «Служба Windows» на C#. Далее создать проект Visual C++ -> CLR -> Библиотека классов, в ней собственно реализовать все что нужно, добавить dll, как ссылку в проекте C#.

Что можете подсказать по данной задаче?

Использую Visual Studio 2012. Нашел что в ней можно создать еще некий проект ATL, при создании проекта можно выбрать тип приложения «Служба.exe» — может это то, что мне нужно на самом деле, если так подскажите пример или уроки создания подобного приложения.

Socket и windows service (служба)
Пишу IPC(межпроцессорное воздействие) между служебным приложением и Windows forms (дальше WF).

Что такое служба ? Windows Service
Рассматриваю вариант решение поставленной задачи написанием своей службы. Собственно, доки.

Создание Windows Service
Добрый день! Пытаюсь разобраться как писать вин сервисы, что это за зверь такой и зачем он вообще.

Создание Windows Service
Добрый день, пытаюсь разработать обычный виндусовский сервис, вот мой код: #include .

Добрый день. Открыл пример создания сервиса. Но на 7й винде выдёт ошибку. У меня студия 2012. Если запускаю через неё — то выдаёт Первый этап обработки исключения по адресу 0x759EC41F (KernelBase.dll) в ConsoleApplication1.exe: 0x00000005: Отказано в доступе.

Если запускаю экзешник из папки от имени администратора, то GetLastError выдаёт 183 ошибку.

Вот код всего main.cpp

использовал данный пример на Win7 32bit + VS2012. Все работает добротно

Службы выполняются в отдельной, неинтерактивной оконной станции, которая изолирована от
оконной станции пользователя. Поэтому окна, которые пытается отображать служба или
созданные ей процессы, на рабочем столе пользователя не видны. Это во-первых.

Во-вторых, для служб выделена отдельная нулевая сессия. На Windows XP и Windows Server 2003 в
этой же сессии выполняются процессы первого залогиненного пользователя. Начиная с Windows
Vista, нулевая сессия принадлежит исключительно службам, а пользовательские сессии начинаются с
первой (Session 0 Isolation).

В-третьих, запуская notepad.exe из службы, Вы запускаете его с правами службы, а не пользователя.
Со всеми вытекающими последствиями.

Могу ли я запустить процесс из службы с правами пользователя?

P.S. В какой литературе можно поподробнее почитать об этом(на русском)?

Если нужен запуск процесса при входе пользователя в систему, то лучше и проще
автозагрузки для этой задачи решения не существует.

Если процесс нужно запускать в произвольные моменты времени, когда пользователь уже
залогинен, то здесь все усложняется. Нужно из службы вызвать WTSQueryUserToken и с
полученным токеном запустить процесс через CreateProcessAsUser. При этом следует, как
минимум, создать для нового процесса блок переменных окружения — CreateEnvironmentBlock, в
противном случае он унаследует блок переменных системного процесса.

Здесь самая тонкость в том, что для WTSQueryUserToken нужен ID пользовательской сессии, в
которой будет создаваться новый процесс. Существует только один корректный способ
получить этот ID — это подписаться в службе на событие SERVICE_CONTROL_SESSIONCHANGE и
вести учет всех созданных сессий, а также их состояний. Но на этом пути Вас будут поджидать
различные ловушки, так что «малой кровью» обойтись не удастся.

Подробности ищите на RSDN, я по этой теме там отписывался предельно подробно.

Оцените статью