как создать свою службу в windows
Практическое руководство. Создание служб Windows
Эта документация не относится к последней версии службы Windows. Последние сведения о службах Windows с использованием BackgroundService, а также о шаблоне рабочей службы см. в следующих статьях:
При создании службы можно использовать шаблон проекта Visual Studio, который называется Служба Windows. Этот шаблон автоматически выполняет основную часть работы, ссылаясь на необходимые классы и пространства имен, устанавливая наследование от базового класса для служб и переопределяя некоторые методы, которые вы обычно хотите переопределять.
Шаблон проекта «Службы Windows» в экспресс-выпуске Visual Studio отсутствует.
Для создания функциональной службы необходимо выполнить, как минимум, следующее:
Создайте установщики, необходимые для приложения службы.
Переопределите и задайте код для методов OnStart и OnStop для настройки режимов поведения службы.
Создание приложения службы Windows
Создайте проект Служба Windows.
Инструкции по созданию службы без использования шаблона см. в разделе Практический пример. Создание служб программным способом.
В окне Свойства задайте для своей службы свойство ServiceName.
Значение ServiceName свойства всегда должно соответствовать имени, указанному в классах установщика. При изменении этого свойства необходимо также обновить свойство ServiceName классов установщика.
Установите любые из следующих свойств для определения режима работы службы.
Откройте редактор кода и введите данные для выполнения операций для процедур OnStart и OnStop.
Переопределите все прочие методы, для которых необходимо определить функциональные возможности.
Добавить установщики, необходимые для приложения службы. Дополнительные сведения см. в разделе Практическое руководство. Добавление установщиков в приложение-службу.
Скомпилируйте проект, выбрав в меню Сборка пункт Собрать решение.
Не нажимайте клавишу F5 для запуска проекта — таким способом нельзя запустить проект службы.
Установите службу. Дополнительные сведения см. в разделе Практическое руководство. Установка и удаление служб.
Как в Windows 10 создать собственную системную службу
Открыв Диспетчер задач и переключившись на вкладку «Подробности», можно обнаружить ряд процессов, которые явно не имеют никакого отношения к запущенным пользователем прикладным программам. Многие из таких процессов принадлежат службам — особым программным модулям, стартующим вместе с Windows, работающим в скрытом режиме и выполняющим подчас очень важную работу. Но тут у многих может возникнуть вопрос.
А разве прикладные программы не могут работать в скрытом режиме и точно так же запускаться вместе с Windows, будучи добавленными в автозагрузку?
Чем службы отличаются от программ, добавленных в автозагрузку
Это хороший вопрос, и на него можно ответить утвердительно, однако понятие «автозагрузка» часто употребляется в широком смысле слова без различия, что именно и как именно загружается. Если вы имеете общие представления о работе процессов Linux, то наверняка знакомы с такой сущностью как демон. Это процесс, но процесс несвязанный с каким-либо конкретным пользователем и работающий как-бы автономно. Службы в Windows очень похожи на этих самых демонов, они тоже независимы от пользователей. Когда вы добавляете в автозагрузку программу, пусть даже не имеющую графического интерфейса, она запускается в рабочем окружении пользователя при входе последнего в свою учетную запись, тогда как службы запускаются еще до ввода пользователем логина и пароля и напрямую с ним не взаимодействуют.
Теперь, когда вы поняли основную разницу между добавленными в автозагрузку приложениями и службами, мы научимся создавать такие службы сами и использовать их для разных целей, например, для мониторинга портов или еще чего-нибудь; главное — это найти программу или скрипт, который будет выполнять необходимое вам действие.
А еще вам понадобиться бесплатный инструмент Non-Sucking Service Manager, который «превратит» обычный процесс в службу. Название программы не очень благозвучное даже для носителя английского языка, но это не так уже и важно. Главное, что она работает. Скачать ее можно с сайта разработчика nssm.cc/download.
Вот так он выглядит «изнутри».
Сначала проверим, работает ли сам скрипт. Кликаем по нему ПКМ и выбираем «Выполнить с помощью PowerShell».
Если скрипт заработал, вы увидите в консоли текст «Транскрибирование запущенно, выходной файл… и его адрес».
В результате в каталоге со скриптом у вас появится каталог «Logs» с файлом отчета в простом текстовом формате.
Создаем службу
В открывшемся окошке установщика вы увидите три поля:
Аргумент ExecutionPolicy нужен для предоставления скрипту временных прав на запуск. Если в качестве службы вы устанавливаете какую-нибудь утилиту, то поле может быть оставлено как пустым, так и с указанным в нём аргументом данной конкретной утилиты.
Всё готово, жмем «Install service», чтобы установить службу.
Окно установщика содержит и другие вкладки, дополнительные. Например, на вкладке «Details» можно указать описание и отображаемое в оснастке управления службами имя службы, которое будет отличаться от указанного в команде nssm install, а на вкладке «Log on» выбрать учетную запись, от имени которой станет работать служба.
По умолчанию создаваемая служба работает от имени самой системы, как и положено. Открыв оснастку управления службами, вы увидите в списке и свою службу. Она будет иметь тип запуска «Автоматически», но находиться в остановленном состоянии. Запустится она при следующей загрузке, либо вы сами можете ее запустить.
Удаление службы
И подтверждаем действие нажатием кнопки «Да» в миниатюрном диалоговом окошке.
Ну вот, теперь вы знаете, как создавать собственные службы для утилит и скриптов, которые могут работать независимо от пользователя в скрытом режиме.
Создание службы в Windows 10
Бывает, что имеется некий исполняемый файл, который необходимо зарегистрировать в системе как службу Windows 10. Существует множество различных способов, которые позволяют это сделать. Сейчас мы рассмотрим два основных и проверенных метода создания службы Windows.
Создание службы с помощью программы Sc.exe
Первый способ позволяет создавать службы, используя утилиты, работающие через командную строку. В данном случае, используется инструмент sc.exe. Он позволяет взаимодействовать с функциями API и выполнять операции со службами Windows 10. Несмотря на то, что данная программа даже не обладает графическим интерфейсом, она является мощным инструментом и может контролировать состояние служб, создавать, редактировать и управлять ими.
Если создавать службу, с помощью sc.exe, то не возникает необходимости в изменении параметров реестра и списка служб в диспетчере. Кроме того, утилита способна работать со службами на локальном компьютере, и выполнять те же действия на удаленных машинах.
Чтобы создать новый сервис, откройте командную строку от имени администратора и запустите команду «Sc create». Она запишет новую службу к базе диспетчера служб. Синтаксис команды представлен следующим образом:
Чтобы было понятнее, в качестве примера, мы создадим службу «MySevice». При этом, отображаемое имя будет «My New Service». Указываем тип службы и включаем автозапуск:
Sc create MyService binPath=C:\MyService\MyService.exe DisplayName=″My New Service″ type=own start=auto
Теперь откройте оснастку «Services» и взгляните на то, что получилось:
Параметры службы, которая уже была создана и запущена, можно изменить при помощи команды Sc config. К примеру, мы заменим имя службы, которое отображается как:
Sc config MyService DisplayName=″My Service″
А еще можно избавиться от службы полным ее удалением. Для этого используйте такую команду:
С помощью утилиты PowerShell
Если не считать дополнительную возможность добавления описаний к службам, PowerShell обладает таким же функционалом, как и утилита Sc.exe. Но есть один маленький минус — здесь нет простой команды для удаления службы. Поэтому приходиться использовать такой вот, немного мудреный, код:
Учебник. Создание приложения службы Windows
Эта документация не относится к последней версии службы Windows. Последние сведения о службах Windows с использованием BackgroundService, а также о шаблоне рабочей службы см. в следующих статьях:
Из этой статьи вы узнаете, как создать в Visual Studio приложение службы Windows, которое записывает сообщения в журнал событий.
Создание службы
Для начала создайте проект и настройте значения, необходимые для правильной работы службы.
В Visual Studio в меню Файл последовательно выберите пункты Создать > Проект (или нажмите клавиши CTRL+SHIFT+N), чтобы открыть окно Новый проект.
В поле Имя введите MyNewService, а затем нажмите кнопку ОК.
Откроется вкладка Проект (Service1.cs [Проект] или Service1.vb [Проект] ).
Переименование службы
Измените имя службы с Service1 на MyNewService.
В обозревателе решений выберите файл Service1.cs или Service1.vb, а затем выберите в контекстном меню команду Переименовать. Переименуйте файл в MyNewService.cs или MyNewService.vb и нажмите клавишу ВВОД.
Появится всплывающее окно, предлагающее переименовать все ссылки на элемент кода Service1.
Выберите Да.
На вкладке Проект выберите в контекстном меню пункт Свойства. В окне Свойства измените значение ServiceName на MyNewService.
В меню Файл выберите команду Сохранить все.
Добавление компонентов в службу
В этом разделе к службе Windows будет добавлен настраиваемый журнал событий. Компонент EventLog — это пример типа компонента, который можно добавить в службу Windows.
Добавление возможности работы с настраиваемым журналом событий
В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор.
В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Просмотреть код.
Добавьте оператор using в файл MyNewService.cs (если его еще нет) или оператор Imports в файл MyNewService.vb для пространства имен System.Diagnostics.
В меню Файл выберите команду Сохранить все.
Определение действий при запуске службы
В редакторе кода для файла MyNewService.cs или MyNewService.vb найдите метод OnStart. Пустое определение метода было автоматически добавлено при создании проекта в Visual Studio. Добавьте код, с помощью которой запись сохраняется в журнале событий при запуске службы:
Опрос
Так как приложение службы предполагает длительное время выполнения, оно обычно опрашивает или отслеживает систему. Отслеживание настраивается в методе OnStart. После начала работы службы метод OnStart должен возвращать управление операционной системе, чтобы она не блокировалась.
Для создания простого механизма опроса используйте компонент System.Timers.Timer. Таймер через определенные интервалы времени генерирует событие Elapsed, при возникновении которых служба может выполнять отслеживание. Компонент Timer используется следующим образом:
Настройка механизма опроса.
Чтобы настроить механизм опроса, добавьте следующий код в событие MyNewService.OnStart :
Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Timers.
В классе MyNewService добавьте метод OnTimer для обработки события Timer.Elapsed.
В класс MyNewService добавьте переменную-член. Она содержит идентификатор следующего события, которое сохраняется в журнале событий.
Задачи можно выполнять с помощью фоновых рабочих потоков, а не выполнять всю работу в основном потоке. Для получения дополнительной информации см. System.ComponentModel.BackgroundWorker.
Определение действий при остановке службы
Вставьте в метод OnStop строку кода, с помощью которой запись сохраняется в журнале событий при остановке службы:
Определение других действий для службы
Вы можете переопределить методы OnPause, OnContinue и OnShutdown, добавив дополнительные процессы обработки.
Следующий код показывает, как можно переопределить метод OnContinue в классе MyNewService :
Установка состояния службы
Службы сообщают о своем состоянии диспетчеру служб, чтобы пользователь мог определить, работает ли служба правильно. По умолчанию служба, которая наследуется от ServiceBase, сообщает ограниченный набор состояний, включая SERVICE_STOPPED, SERVICE_PAUSED и SERVICE_RUNNING. Если служба запускается не сразу, полезно обеспечить сообщение состояния SERVICE_START_PENDING.
Состояния ERVICE_START_PENDING и SERVICE_STOP_PENDING можно реализовать путем добавления кода, вызывающего функцию Windows SetServiceStatus.
Реализация состояния ожидания службы
Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Runtime.InteropServices.
Добавьте следующий код в файл MyNewService.cs или MyNewService.vb для объявления значений ServiceState и добавления структуры для состояния, которая будет использоваться при вызове неуправляемого кода:
В классе MyNewService объявите функцию SetServiceStatus с помощью вызова неуправляемого кода:
Для реализации состояния SERVICE_START_PENDING добавьте следующий код в начало метода OnStart:
Для установки состояния SERVICE_RUNNING добавьте код в конце метода OnStart :
Если метод OnStop выполняется долго, повторите данную процедуру для OnStop (необязательно). Реализуйте состояние SERVICE_STOP_PENDING и обеспечьте возврат состояния SERVICE_STOPPED до того, как метод OnStop вернет управление.
Добавление установщиков в службу
Перед тем как запускать службу Windows, ее нужно установить. При этом она регистрируется в диспетчере служб. В проект можно добавить установщики, которые обрабатывают сведения о регистрации.
В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор.
В представлении Конструктор щелкните область фона правой кнопкой мыши и выберите в контекстном меню команду Добавить установщик.
В представлении Конструктор для ProjectInstaller выберите serviceInstaller1 для проекта Visual C# или ServiceInstaller1 для проекта Visual Basic. Затем в контекстном меню выберите пункт Свойства.
Убедитесь в том, что в окне Свойства свойство ServiceName имеет значение MyNewService.
Введите для свойства Description какой нибудь текст, например Пример службы.
Этот текст отображается в столбце Описание в окне Службы и помогает пользователю понять, для чего служба нужна.
Введите текст для свойства DisplayName, например Отображаемое имя MyNewService.
Этот текст отображается в столбце Отображаемое имя в окне Службы. Это имя может отличаться от значения свойства ServiceName, которое представляет собой имя, используемое в системе (например, когда вы запускаете службу с помощью команды net start ).
Выберите для свойства StartType значение Automatic в раскрывающемся списке.
В итоге окно Свойства должно выглядеть так:
В представлении Конструктор для ProjectInstaller выберите serviceProcessInstaller1 для проекта Visual C# или ServiceProcessInstaller1 для проекта Visual Basic. Затем в контекстном меню выберите пункт Свойства. Выберите для свойства Account значение LocalSystem в раскрывающемся списке.
Это позволит установить и запускать службу от имени локальной системной учетной записи.
Дополнительные сведения об установщиках см. в руководстве по добавлению установщиков в приложение-службу.
Установка параметров запуска (необязательно)
Прежде чем добавлять параметры запуска, решите, является ли это наилучшим способом передачи информации в службу. Хотя параметры запуска просты для использования и синтаксического анализа и пользователи могут легко их переопределять, для пользователей их поиск и применение могут оказаться затрудненными (без документации). Как правило, если вашей службе требуется всего несколько параметров запуска, то следует использовать реестр или файл конфигурации.
Служба Windows может принимать аргументы командной строки или параметры запуска. При добавлении кода в параметры запуска процесса пользователь может запускать службу со своими собственными специальными параметрами из окна свойств службы. Однако эти параметры запуска не сохраняются при следующем запуске службы. Задать постоянные параметры запуска можно в реестре.
Для каждой службы Windows создается запись в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Для хранения информации, к которой может обращаться ваша служба, в разделе службы можно использовать подраздел Parameters. Файлы конфигурации приложения для службы Windows можно использовать так же, как и для программ других типов. Пример кода см. в разделе ConfigurationManager.AppSettings.
Добавление параметров запуска
В файле MyNewService.cs или MyNewService.vb измените конструктор MyNewService для обработки входного параметра следующим образом:
Этот код задает имя источника события и журнала в соответствии с указанными пользователем параметрами запуска. Если аргументы не заданы, используются значения по умолчанию.
Чтобы задать аргументы командной строки, добавьте следующий код в класс ProjectInstaller в файле ProjectInstaller.cs или ProjectInstaller.vb:
Как правило, это значение представляет собой полный путь к исполняемому файлу службы Windows. Для правильного запуска службы пользователь должен заключить путь и каждый параметр в кавычки. Чтобы изменить параметры запуска службы Windows, пользователь может настроить параметры в разделе реестра ImagePath. Однако лучше изменять их программными средствами и создать для пользователей удобный интерфейс для этой возможности, например в виде программы управления или настройки.
Сборка службы
В обозревателе решений выберите пункт Свойства в контекстном меню проекта MyNewService.
Отобразятся страницы свойств для проекта.
На вкладке Приложение в списке Автоматически запускаемый объект выберите MyNewService.Program (или Sub Main для проекта Visual Basic).
Чтобы выполнить сборку проекта, в обозревателе решений выберите в контекстном меню проекта пункт Сборка (или нажмите клавиши CTRL+SHIFT+B).
Установка службы
После создания службы Windows ее можно установить. Чтобы установить службу Windows, необходимо иметь разрешения администратора на том компьютере, где выполняется установка.
Откройте Командную строку разработчика Visual Studio с учетными данными администратора.
В командной строке разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта (по умолчанию это подкаталог \bin\Debug проекта).
Введите следующую команду:
Если служба установлена успешно, команда сообщит об успешном выполнении.
Если процесс installutil.exe завершается сбоем, найдите причину в журнале установки. По умолчанию журнал находится в той же папке, что и исполняемый файл службы. Установка может завершиться сбоем по указанным ниже причинам.
Запуск и выполнение службы
В Windows откройте классическое приложение Службы. Нажмите клавиши Windows+R, чтобы открыть окно Выполнить, введите services.msc и нажмите клавишу ВВОД или кнопку ОК.
Заданное вами отображаемое имя службы отобразится в списке Службы, представленном в алфавитном порядке.
Чтобы запустить службу, в ее контекстном меню выберите пункт Запустить.
Чтобы остановить службу, в ее контекстном меню выберите пункт Остановить.
Для запуска и остановки службы в командной строке можно использовать команды net start и net stop (необязательно).
Проверка журнала событий для службы
В Windows откройте классическое приложение Просмотр событий. Введите строку Просмотр событий в поле поиска Windows и выберите Просмотр событий в результатах поиска.
В Visual Studio доступ к журналам событий можно получить, открыв обозреватель сервера в меню Вид (или нажав клавиши CTRL+ALT+S) и развернув узел Журналы событий для локального компьютера.
В средстве просмотра событий разверните узел Журналы приложений и служб.
Найдите в списке элемент MyNewLog (или MyLogFile1, если вы использовали процедуру добавления аргументов командной строки) и разверните его. Вы увидите записи для двух действий (запуск и остановка), которые выполнила ваша служба.
Очистка ресурсов
Если приложение службы Windows вам больше не нужно, его можно удалить.
Откройте Командную строку разработчика Visual Studio с учетными данными администратора.
В окне Командная строка разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта.
Введите следующую команду:
Если служба удалена успешно, команда сообщит об этом. Дополнительные сведения см. в разделе Практическое руководство. Установка и удаление служб.
Следующие шаги
Теперь, после создания службы, можно выполнить указанные ниже действия.
Создайте автономную программу установки, с помощью которой другие пользователи могут устанавливать вашу службу Windows. Создать установщик для службы Windows можно с помощью набора инструментов WiX. Другие идеи можно почерпнуть в статье о создании пакета установщика.
Изучите возможности компонента ServiceController, который позволяет отправлять команды в установленную службу.
Для создания журнала событий при установке приложения, а не во время его запуска, можно воспользоваться установщиком. В этом случае журнал событий удаляется установщиком при удалении приложения. Для получения дополнительной информации см. EventLogInstaller.