Установка службы windows

Содержание

Программа установки службы

Установка службы windows
26

C# и .NET — Основы .NET — Программа установки службы

Любая служба должна конфигурироваться в системном реестре. Все службы размещаются в разделе HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services.

Просматривать содержащиеся в системном реестре записи можно с помощью утилиты regedit. Здесь содержатся сведения о типе службы, ее отображаемом имени, пути к ее исполняемому файлу, конфигурации запуска и т.д..

На рисунке для примера показано, как в системном реестре выглядит конфигурация службы W3SVC:

Подобная конфигурация может обеспечиваться с помощью классов установщиков из пространства имен System.ServiceProcess.

Чтобы добавить к службе программу установки, необходимо переключиться на представление визуального конструктора в Visual Studio и выбрать в контекстном меню пункт Add Installer (Добавить установщик). В результате создается новый класс ProjectInstaller, а также экземпляры классов ServiceInstaller и ServiceProcessInstaller.

Класс Installer

Класс ProjectInstaller унаследован от System.Configuration.Install.Installer. Этот класс является базовым для всех специальных установщиков.

С помощью класса Installer можно создавать процедуры установки, основанные на транзакциях.

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

Внутри конструктора класса ProjectInstaller вызывается метод InitializeComponent():

using System.ComponentModel; using System.Configuration.Install; namespace WinServices { [RunInstaller(true)] public partial class ProjectInstaller : Installer { public ProjectInstaller() { InitializeComponent(); } private void serviceProcessInstaller1_AfterInstall(object sender, InstallEventArgs e) { } } } Внутри кода реализации InitializeComponent() создаются экземпляры классов ServiceProcessInstaller и ServiceInstaller. Оба этих класса унаследованы от ComponentInstaller, который, в свою очередь, унаследован от класса Installer.

Классы, унаследованные от ComponentInstaller, могут использоваться для настройки процесса установки. Не следует забывать о том, что процесс службы может предусматривать запуск более чем одной службы.

Класс ServiceProcessInstaller может применяться для настройки процесса, который будет отвечать за определение значений для всех запускаемых внутри данного процесса служб, а класс ServiceInstaller — для настройки каждой из этих служб, т.е. для каждой службы должен применяться отдельный экземпляр ServiceInstaller.

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

namespace Wrox.ProCSharp.WinServices { partial class ProjectInstaller { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// /// Required method for Designer support – do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); // // serviceProcessInstaller1 // this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.NetworkService; this.serviceProcessInstaller1.Password = null; this.serviceProcessInstaller1.Username = null; this.serviceProcessInstaller1.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_AfterInstall); // // serviceInstaller1 // this.serviceInstaller1.ServiceName = “QuoteService”; // // ProjectInstaller // this.Installers.AddRange(new System.Configuration.Install.Installer[] { this.serviceProcessInstaller1, this.serviceInstaller1}); } #endregion private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1; private System.ServiceProcess.ServiceInstaller serviceInstaller1; } }

Здесь видно, что ServiceProcessInstaller производит установку программы, которая реализует класс ServiceBase. Класс ServiceProcessInstaller имеет свойства, предназначенные для всего процесса. Ниже приведено краткое описание этих свойств, к которым предоставляется доступ всем службам внутри процесса:

Username, Password

Указывает, от имени какой учетной записи пользователя должна запускаться служба в случае установки свойства Account в ServiceAccount.User.

Account

Позволяет указывать тип учетной записи службы.

HelpText

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

Процесс, применяемый для запуска службы, может быть определен в свойстве Account класса ServiceProcessInstaller с использованием перечисления ServiceAccount. Ниже приведено краткое описание всех значений, которые могут устанавливаться для свойства Account.

ServiceInstaller — это класс, который необходим всем службам. Для каждой службы внутри процесса он поддерживает следующие свойства: StartType, DisplayName, ServiceName и ServicesDependedOn. Краткое описание этих свойств приведено ниже:
LocalSystem

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

NetworkService

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

LocalService

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

User

Установка для свойства Account значения ServiceAccount.User означает, что пользователь может определять учетную запись, которая должна использоваться в данной службе.

StartType

Свойство StartType указывает, должна служба запускаться вручную или автоматически. Возможные значения: ServiceStartMode.Automatic, ServiceStartMode.Manual, ServiceStartMode.Disabled.

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

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

DelayedAutoStartВ случае если для свойства StartType установлено не Automatic, это свойство игнорируется. Оно указывает, должна ли служба запускаться не сразу же после загрузки системы, а немного позже. Это свойство появилось в .NET 4 и поддерживается, начиная с Windows Vista.
DisplayName

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

ServiceName

Это свойство указывает, как должно вообще выглядеть имя службы. Его значение должно совпадать со значением ServiceName внутри класса ServiceBase в программе службы. Именно с его помощью конфигурация ServiceInstaller будет ассоциироваться с требуемой программой службы.

ServicesDependentOn

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

Изменив имя службы в унаследованном от ServiceBase классе, не забудьте изменить и значение свойства ServiceName в объекте ServiceInstaller!

На стадии тестирования лучше устанавливать для свойства StartType значение Manual. Тогда при невозможности остановить службу (например, из-за присутствия в ней дефекта) перезапустить систему все равно будет получаться.

В случае установки для StartType значения Automatic служба будет автоматически запускаться снова даже после перезагрузки системы.

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

Класс ServiceInstallerDialog

Еще одним классом установщика в пространстве имен System.ServiceProcess.Design является ServiceInstallerDialog. Этот класс можно применять, если необходимо, чтобы во время установки службы системный администратор вводил имя пользователя и пароль учетной записи, которая должна для нее использоваться.

Если установить свойство Account класса ServiceProcessInstaller в ServiceAccount.User, а свойства Username и Password — в null, то во время процесса установки на экране будет отображаться диалоговое окно Set Service Login (Установить регистрационную информацию для службы).

В этом окне также есть возможность отменить процесс установки.

Утилита installutil

После добавления классов установщиков в проект с помощью утилиты installutil.ехе можно попробовать установить и удалить службу. Эта утилита позволяет производить установку любой сборки, которая имеет класс Installer. Для выполнения установки он вызывает метод Install() класса, унаследованного от Installer, а для удаления ранее установленной сборки — соответственно, метод Deinstall().

Команды, которые можно использовать для установки и удаления рассматриваемой примера службы, выглядят следующим образом:

installutil quoteservice.exe installutil /u quoteservice.exe

Если процесс установки завершился неудачей, обязательно загляните в журналы установки Installutil.InstallLog и .InstallLog. Часто в них удается обнаружить полезную информацию вроде сообщения “The specified service already exists ” (“Указанная служба уже существует “).

Источник: https://professorweb.ru/my/csharp/base_net/level4/4_4.php

Как в Windows 10 создать собственную системную службу

Установка службы windows

Открыв Диспетчер задач и переключившись на вкладку «Подробности», можно обнаружить ряд процессов, которые явно не имеют никакого отношения к запущенным пользователем прикладным программам.

Многие из таких процессов принадлежат службам — особым программным модулям, стартующим вместе с Windows, работающим в скрытом режиме и выполняющим подчас очень важную работу. Но тут у многих может возникнуть вопрос.

А разве прикладные программы не могут работать в скрытом режиме и точно так же запускаться вместе с Windows, будучи добавленными в автозагрузку?

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

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

Если вы имеете общие представления о работе процессов Linux, то наверняка знакомы с такой сущностью как демон. Это процесс, но процесс несвязанный с каким-либо конкретным пользователем и работающий как-бы автономно.

Службы в Windows очень похожи на этих самых демонов, они тоже независимы от пользователей.

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

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

А еще вам понадобиться бесплатный инструмент Non-Sucking Service Manager, который «превратит» обычный процесс в службу. Название программы не очень благозвучное даже для носителя английского языка, но это не так уже и важно. Главное, что она работает. Скачать ее можно с сайта разработчика nssm.cc/download.

Создавать службу (чисто для примера) мы будем из процесса скрипта PowerShell, замеряющего среднее значения загруженности процессора и сохраняющего данные в текстовый лог.

Скачать скрипт можно по ссылке yadi.sk/d/3pJmyAvNB8poIQ.

Вот так он выглядит «изнутри».

Сначала проверим, работает ли сам скрипт. Кликаем по нему ПКМ и выбираем «Выполнить с помощью PowerShell».

Если в консоли будет выведен запрос на разрешение выполнения скриптов, вводим Y и нажимаем ввод.

Если скрипт заработал, вы увидите в консоли текст «Транскрибирование запущенно, выходной файл… и его адрес».

В результате в каталоге со скриптом у вас появится каталог «Logs» с файлом отчета в простом текстовом формате.

Создаем службу

Теперь переходим к работе с Non-Sucking Service Manager. Открыв от имени администратора командную строку и перейдя в расположение исполняемого файла утилиты nssm.exe соответствующей разрядности, выполняем команду nssm install logCPUAvg, где logCPUAvg — имя новой службы.

В открывшемся окошке установщика вы увидите три поля:

  • Path – в нем указываем путь к обработчику, то есть PowerShell, файл консоли находится в папке C:\Windows\System32\PowerShell.
  • Startup directory – папка с исполняемым файлом обработчика, поле заполнится автоматически.
  • Arguments – в этом поле прописываем команду -ExecutionPolicy Bypass -NoProfile -File “полный-путь-к-скрипту”.

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

Всё готово, жмем «Install service», чтобы установить службу.

Окно установщика содержит и другие вкладки, дополнительные. Например, на вкладке «Details» можно указать описание и отображаемое в оснастке управления службами имя службы, которое будет отличаться от указанного в команде nssm install, а на вкладке «Log on» выбрать учетную запись, от имени которой станет работать служба.

По умолчанию создаваемая служба работает от имени самой системы, как и положено. Открыв оснастку управления службами, вы увидите в списке и свою службу. Она будет иметь тип запуска «Автоматически», но находиться в остановленном состоянии. Запустится она при следующей загрузке, либо вы сами можете ее запустить.

То, что скрипт заработал, станет видно из того, что в месте его расположения появится папка «Logs», при этом вывод самой консоли будет скрыт. И вот что интересно.

Запустив службу, мы вышли из учетной записи в 12.46, а затем вошли в нее в 12.

50, но служба продолжала работать даже в наше отсутствие в системе! Это еще раз говорит о том, что системная служба не связана с пользовательским окружением.

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

Помимо того, что вы можете остановить службу в оснастке, переведя ее в статус «Отключена», вы властны ее полностью удалить с помощью той же NSSM. Для этого в командной строке выполняем команду nssm remove имя-службы.

И подтверждаем действие нажатием кнопки «Да» в миниатюрном диалоговом окошке.

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

Оцените Статью:

(2 5,00 из 5)
Загрузка…

Рубрики: 10, Windows

демоны, процесс, сервис, Система, службы

Источник: https://www.white-windows.ru/kak-v-windows-10-sozdat-sobstvennuyu-sistemnuyu-sluzhbu/

Как получить доступ ко всем «Службам» в ОС Windows 10

Установка службы windows

Простым языком о том что такое “Службы”, как их открыть и отключить в случае необходимости.

Что такое “Службы” в Windows 10

Службы Windows — это не имеющие интерфейса и работающие в фоновом режиме программы. Они используются операционной системой для управления сетевыми подключениями, воспроизведения звука, обеспечения функциональности файловой системы, безопасности и аутентификации, отображения цветов и взаимодействие с пользователем через интерфейс.

Таким образом, службы выступают чем-то вроде средства связи между Windows и многочисленными компонентами системы. Это позволяет наладить рабочую среду так, чтобы она работала без сбоев.

Пример служб Windows

  • Active Directory Service (Активный каталог).Данная служба Microsoft разработана специально для сетей Windows. Она включена по умолчанию в большинство систем Microsoft Windows Server. Активный каталог контролирует централизованное управление доменом и функцией идентификации.
  • Prefetch и Superfetch.Задача этих служб — повышение скорости запуска операционной системы и приложений путем кэширования в оперативную память часто используемых файлов. Программа работает автоматически, отслеживая часто используемые программы.
  • Background Intelligent Transfer Service (Фоновая интеллектуальная служба передачи данных).Данная служба облегчает дросселирование, приоритезацию и асинхронную передачу файлов между компьютерами через полосу пропускания. Она играет ключевую роль в поставке обновлений для пользователей Windows.
  • DNS Client Service (Служба DNS-клиентов).Задача данной службы — обработка доменных имен в IP-адреса. Кроме того, она позволяет локально кэшировать полученные данные.
  • Computer Browser Service.Эта служба помогает пользователям находить общие файлы на соседних компьютерах. Вся информация обрабатывается лишь на одном из них — Master Browser. Как следствие, чтобы получить нужные файлы, другие компьютеры обращаются к компьютеру-хосту.
  • Internet Connection Sharing (ICS, Общий доступ подключения к интернету).ICS позволяет использовать одно устройство, подключенное к интернету, в качестве точки доступа для других устройств. Такой доступ может осуществляться через широкополосный Ethernet, сотовую связь, WiFi или другой шлюз.
  • Routing and Remote Access Service (Служба маршрутизации и удаленного доступа).Данный сервис позволяет создавать приложения, управляющие возможностями удаленного доступа и маршрутизации Windows. Это помогает обозначить устройство в качестве сетевого маршрутизатора.

И это лишь малая часть служб, которые вы можете найти.

Часть из них жизненно необходима для Windows, и без них операционная система не проработает одной минуты, а часть можно смело отключать.

В этой статье мы рассмотрим 7 способов открыть службы Windows, а также разберем как можно отключить ненужные фоновые сервисы.

Способ 1. Поиск внутри системы

Самый простой и при этом недооцененный способ запуска утилиты — поиск ее внутри системы. Его можно использовать не только для обозначенного нами сервиса, но и для любого другого стандартного компонента Windows 10.

Чтобы открыть утилиту, просто щелкните левой кнопкой мыши по меню Пуск и введите команду Службы. Кликните по найденному приложению и запустите его.

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

Способ 2. Меню Пуск

С выходом операционной системы Windows 10, ее интерфейс был существенно переработан, в сравнении с более старыми версиями. Тем не менее, многие стандартные приложения по прежнему можно отыскать привычным нам способом.

1. Откройте меню Пуск, щелкнув по клавише в левом нижнем углу.

2. Пролистайте список приложений пока не увидите папку Средства администрирования.

3. Откройте данную папку и среди представленных компонентов найдите утилиту Службы.

4. Запустите утилиту.

Способ 3. Запуск с помощью команд

Большинство стандартных приложений операционной системы Windows 10 можно запускать с помощью ввода специальных команд. Поначалу их придется гуглить, но с опытом вы наверняка их все запомните.

https://www.youtube.com/watch?v=TkpmFxLagkY

Командой запуска утилиты “Службы” является: services.msc

1. Откройте меню Пуск, щелкнув по иконке Windows в левом нижнем углу.

2. В диалоговом окне введите команду services.msc.

3. Запустите найденное приложение.

Дополнительные способы.

Утилита “Выполнить”.

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

1. Откройте утилиту Выполнить с помощью комбинации клавиш Windows + R.

2. Введите команду services.msc и нажмите Enter.

По завершению выполнения инструкции, перед вами появится окно утилиты “Службы”.

“Командная строка”

Консольную утилиту Windows можно использовать не только как “средство от всех проблем” в операционной системе. С ее помощью также можно выполнять быстрый запуск стандартных приложений. Работает командная строка аналогично утилите “Выполнить”.

1. Откройте командную строку.

2. Введите команду services.msc и нажмите Enter.

Утилита “Службы” должна теперь запуститься.

“PowerShell”

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

1. Запустите PowerShell любым удобным вам способом.

2. Введите команду services.msc и нажмите клавишу Enter.

“Диспетчер задач”

Пожалуй, самый неожиданный способ запуска утилиты. Хотя на самом деле все вполне логично.

Приложение “Диспетчер задач” известно своими мониторинговыми особенностями, возможностью управлять процессами Windows и даже доступом к настройке автозагрузок. Однако, это далеко не весь ее потенциал.

При желании, вы можете открыть утилиту “Службы” путем запуска нового процесса.

1. Откройте Диспетчер задач.

2. Щелкните по клавише Файл и выберите опцию Запустить новую задачу.

3. В открывшемся диалоговом окне введите команду services.msc и нажмите Enter.

Способ 4. Управление компьютером

Управление компьютером — один из наиболее удобных способов, позволяющих быстро получить нужный результат. Чтобы открыть утилиту “Службы” с помощью данной программы, выполните следующую инструкцию:

1. Щелкните правой кнопкой мыши по меню Пуск.

2. Выберите опцию Управление компьютером.

3. Далее щелкните по меню Службы и приложения.

4. Откройте утилиту Службы.

Способ 5. Панель управления

Несмотря на то, что большинство настроек операционной системы перешли в приложение “Параметры Windows”, Панель управления по прежнему не теряет свою актуальность. Ею всегда можно воспользоваться для поиска служебных программ.

1. Откройте Панель управления.

2. Переключите опцию Просмотр в режим Категории для более простого поиска.

3. Перейдите в раздел Система и безопасность.

4. Далее откройте подраздел Администрирование.

5. Здесь вы можете найти и запустить приложение Службы.

Способ 6. Конфигурация системы

Конфигурация системы — одна из важнейших утилит по настройке операционной системы: ее поведения и запуска.

Если вы решите открыть “Службы” с помощью нее, то получите несколько ограниченный результат.

Тем не менее, именно “Конфигурация системы” поможет быстро включать и отключать сервисы, в то время как работа через классическое приложение “Службы” может отнять значительно больше времени.

Чтобы открыть “Службы” с помощью утилиты “Конфигурация системы”, воспользуйтесь следующей инструкцией:

1. Откройте утилиту Выполнить с использование горячих клавиш Windows + R.

2. Введите команду msconfig и нажмите Enter.

3. Перед вами появится окно утилиты Конфигурация системы.

4. Перейдите в раздел Службы.

5. Здесь вы найдете все интересующие вас сервисы.

Обратите внимание:
Если вы решились отключить некоторые службы, рекомендуем установить галочку рядом с опциейНе отображать службы Майкрософт. Таким образом вы обезопасите себя и компьютер от случайных действий, которые могут спровоцировать сбой системы.

Способ 7. Использование системного файла

Если вам привычнее всего работа с “Проводником” Windows, вы можете вручную найти папку с нужным приложением. Для этого просто нужно знать путь к нему.

Адрес к приложению “Службы”:

C:\Windows\System32

Скопируйте адрес, откройте проводник и вставьте его в адресную строку. Далее нужно нажать Enter.

Все файлы расположены в алфавитном порядке. Поэтому пролистайте список документов ближе к концу содержимого и найдите утилиту services.msc

Откройте утилиту и настройте нужные вам службы.

Как отключить ненужные службы в Windows 10?

Открыв утилиту “Службы”, вы найдете десятки сервисов, отвечающих за те или иные компоненты операционной системы. Большинство из них крайне важны, другие же никоим образом не влияют на работоспособность Windows.

Отключить такие бесполезные службы довольно легко. Рассмотрим на примере сервиса “Факс”.

1. Откройте свойства этой службы.

2. Для начала выберите Тип запуска. Он может быть Автоматическим, Ручным или же вовсе Отключенным.

3. Если служба уже Активна или Отключена, вы можете вручную включить/отключить ее, щелкнув по соответствующим задаче клавишам: Запустить или Остановить.

4. Чтобы сохранить внесенные изменения, нажмите Применить.

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

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

Источник: www.starusrecovery.ru

Источник: https://zen.yandex.ru/media/starusrecovery/kak-poluchit-dostup-ko-vsem-slujbam-v-os-windows-10-5e26b02d1e8e3f00b06da4f0

Установка службы Windows | C#

Установка службы windows

Последнее обновление: 31.10.2015

Для установки службы нам понадобится класс установщика. Для его добавления нажмем правой кнопкой мыши на проект и в контекстном меню выберем Add – > Component…. Затем в окне добавления нового элемента выберем пункт Installer Class:

По умолчанию для файла установщика генерируется название Installer1.cs. Оставим это название.

После добавления узел установщика в окне обозревателя решения (Solution Explorer) будет содержать два файла: сам файл класса Installer1 и файл дизайнера Installer1.Designer.cs. Откроем файл кода. Сейчас он выглядит так:

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.Linq; using System.Threading.Tasks; namespace FileWatcherService { [RunInstaller(true)] public partial class Installer1 : System.Configuration.Install.Installer { public Installer1() { InitializeComponent(); } } }

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

using System.ComponentModel; using System.ServiceProcess; using System.Configuration.Install; namespace FileWatcherService { [RunInstaller(true)] public partial class Installer1 : Installer { ServiceInstaller serviceInstaller; ServiceProcessInstaller processInstaller; public Installer1() { InitializeComponent(); serviceInstaller = new ServiceInstaller(); processInstaller = new ServiceProcessInstaller(); processInstaller.Account = ServiceAccount.LocalSystem; serviceInstaller.StartType = ServiceStartMode.Manual; serviceInstaller.ServiceName = “Service1”; Installers.Add(processInstaller); Installers.Add(serviceInstaller); } } }

Класс установщика унаследован от класса System.Configuration.Install.Installer. Атрибут [RunInstaller(true)] указывает на то, что класс Installer1 должен вызываться при установке сборки, то есть службы.

Он определяет ряд методов: Install() (установка), Commit() (завершает транзакцию установки), Rollback() (восстанавливает состояние компьютера до установки) и Uninstall() (удаление). При необходимости мы можем их переопределить. Но в нашем случае мы будем использовать только конструктор.

В конструкторе вызывается метод InitializeComponent(), который призван выполнять начальную инициализацию. Он определен в файле дизайнера Installer1.Designer.cs и по сути ничего не делает:

private System.ComponentModel.IContainer components = null; private void InitializeComponent() { components = new System.ComponentModel.Container(); }

Для установки службы нам также понадобится классы ServiceInstaller и ServiceProcessInstaller. Почему именно два класса? ServiceProcessInstaller управляет настройкой значений для всех запускаемых служб внутри одного процесса (как было рассмотрено в прошлой теме, метод Main класса Program может одновременно запускать несколько служб).

Класс ServiceInstaller предназначен для настройки значений для каждой из запускаемых служб. То есть если у нас запускается три службы, то для каждой службы создается свой объект ServiceInstaller.

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

Через свойства оба класса позволяют задать настройки службы. Основные свойства ServiceProcessInstaller:

  • Username: определяет, под какой именно учетной записью будет запускаться служба
  • Password: определяет пароль для запуска службы
  • Account: определяет тип учетной записи. Может принимать одно из значений перечисления ServiceAccount:
    • LocalSystem: учетная запись предоставляет широкие привилегии на локальном компьютере и соответствует компьютеру в сети
    • LocalService: учетная запись соответствует пользователю без привилегий на локальном компьютере и предоставляет любому удаленному серверу учетные данные анонимного доступа
    • NetworkService: учетная запись предоставляет широкие локальные привилегии и также представляет любому удаленному серверу учетные данные компьютера
    • User: учетная запись определяется конкретным пользователем в сети
  • HelpText: возвращает справку, содержащую информацию об установке службы

Некоторые важнейшие свойства ServiceInstaller:

  • StartType: определяет, как должна запускаться служба – автоматически или вручную. Может принимать следующие значения: ServiceStartMode.Automatic (автоматический запуск), ServiceStartMode.Manual (вручную) и ServiceStartMode.Disabled (служба по умолчанию отключена)
  • DelayedAutoStart: определяет, должна ли служба запускаться не сразу после загрузки операционной системы, а немного позже
  • DisplayName: устанавливает имя службы, которое будет отображаться в различных утилитах управления службами
  • ServiceName: имя службы, должно совпадать со значением свойства ServiceName у класса службы

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

В конце оба объекта установщиков надо добавить в коллекцию Installers: Installers.Add()

Итак, у нас готов код службы и код инсталяторов. Теперь скомпилируем проект, и в проекте в папке bin/Debug у нас будет лежать исполняемый файл службы, который будет называться по имени проекта и иметь расширение exe. Например, в моем случае он называется FileWatcherService.exe.

И теперь нам надо установить службу. Для этого нам надо запустить специальную утилиту InstallUtil.exe и передать ей имя файла службы.

Утилиту InstallUtil.exe можно найти по пути C:\Windows\Microsoft.NET\Framework64\v4.0.30319 для 64-битных платформ и в C:\Windows\Microsoft.NET\Framework\v4.0.30319 для 32-битных.

Также можно вынести исполняемый файл службы в какое-нибудь другое место, например, я поместил его в папку D://servces. Тогда установка службы в командной строке будет выглядеть так:

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

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

Если нам служба больше не нужна, и мы хотим ее удалить, то мы можем воспользоваться той же утилитой, передав ему флаг u:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>InstallUtil.exe /u D://servces/FileSystemWatcher.exe

И после запуска созданная служба будет мониторить все действия с файлами в папке D://Temp и записывать информацию о действиях в текстовый файл.

Источник: https://metanit.com/sharp/tutorial/21.2.php

Пилим свою службу Windows – руководство для «не настоящих программистов»

Установка службы 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) { Start-Sleep -Milliseconds 10}

Работа так называемого «сервера».

Теперь попробуем превратить скрипт в службу. Для этого скачаем Windows Resource Kit Tools, где будут наши утилиты. Начнем с того, что установим пустой сервис командой:

instsrv WebServ C:\temp\rktools\srvany.exe

Где WebServ — имя нашего нового сервиса. При необходимости через оснастку services.msc можно задать пользователя, под которым будет запускаться служба, и разрешить взаимодействие с рабочим столом.

Теперь пропишем путь к нашему скрипту при помощи магии реестра. Параметры службы есть в разделе реестра HKLM\SYSTEM\CurrentControlSet\Services\WebServ. В нем нам нужно добавить новый раздел Parameters и создать там строковый параметр Application, указав в нем путь к исполняемому файлу. В случае скрипта PowerShell он будет выглядеть так:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:\temp\Polaris\server.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:\temp\Polaris\server.ps1'$arguments = '-ExecutionPolicy Bypass -NoProfile -File “{0}”' -f $scriptPath& $nssm install $serviceName $powershell $arguments& $nssm status $serviceNameStart-Service $serviceNameGet-Service $serviceName

Установка через PowerShell.

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

И вправду работает.

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

GUI запускается командой:

nssm.exe install ServiceName

Настроить можно даже приоритет и использование ядер процессора.

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

Налицо нехватка «жести». Поэтому я перейду к самому хардкорному методу из всех опробованных.

Способ третий. AutoIT

Поскольку я давний любитель этого скриптового языка, то не смог пройти мимо библиотеки под названием _Services_UDF v4. Она снабжена богатой документацией и примерами, поэтому под спойлером сразу приведу полный текст получившегося скрипта.

Листинг скрипта

Итак, попробуем «завернуть» в нее наш веб-сервис:

#NoTrayIcon#RequireAdmin#Region#AutoIt3Wrapper_Version=Beta#AutoIt3Wrapper_UseUpx=n#AutoIt3Wrapper_Compile_Both=y#AutoIt3Wrapper_UseX64=y#EndRegion Dim $MainLog = @ScriptDir & “\test_service.log” #include #include $sServiceName=”WebServ” If $cmdline[0] > 0 Then Switch $cmdline[1] Case “install”, “-i”, “/i” InstallService() Case “remove”, “-u”, “/u”, “uninstall” RemoveService() Case Else ConsoleWrite(” – – – Help – – – ” & @CRLF) ConsoleWrite(“params : ” & @CRLF) ConsoleWrite(” -i : install service” & @CRLF) ConsoleWrite(” -u : remove service” & @CRLF) ConsoleWrite(” – – – – – – – – ” & @CRLF) Exit EndSwitchElse _Service_init($sServiceName) ExitEndIf Func _main($iArg, $sArgs)If Not _Service_ReportStatus($SERVICE_RUNNING, $NO_ERROR, 0) Then _Service_ReportStatus($SERVICE_STOPPED, _WinAPI_GetLastError(), 0) ExitEndIf $bServiceRunning = True$PID=Run(“C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:\temp\Polaris\server.ps1”) While $bServiceRunning_sleep(1000)WEndProcessClose($PID) _Service_ReportStatus($SERVICE_STOP_PENDING, $NO_ERROR, 1000)DllCallbackFree($tServiceMain)DllCallbackFree($tServiceCtrl)_Service_ReportStatus($SERVICE_STOPPED, $NO_ERROR, 0)DllClose($hAdvapi32_DLL)DllClose($hKernel32_DLL)EndFunc Func _Sleep($delay)Local $result = DllCall($hKernel32_DLL, “none”, “Sleep”, “dword”, $delay)EndFunc Func InstallService() #RequireAdmin Local $bDebug = True If $cmdline[0] > 1 Then $sServiceName = $cmdline[2] EndIf If $bDebug Then ConsoleWrite(“InstallService(“&$sServiceName &”): Installing service, please wait”) _Service_Create($sServiceName, $sServiceName, $SERVICE_WIN32_OWN_PROCESS, $SERVICE_AUTO_START, $SERVICE_ERROR_SEVERE, '”' & @ScriptFullPath & '”');,””,False,””,”NT AUTHORITYetworkService”) If @error Then Msgbox(“”,””,”InstallService(): Problem installing service, Error number is ” & @error & @CRLF & ” message : ” & _WinAPI_GetLastErrorMessage()) Else If $bDebug Then ConsoleWrite(“InstallService(): Installation of service successful”) EndIf ExitEndFunc Func RemoveService() _Service_Stop($sServiceName) _Service_Delete($sServiceName) If Not @error Then EndIf ExitEndFunc Func _exit() _Service_ReportStatus($SERVICE_STOPPED, $NO_ERROR, 0);EndFunc Func StopTimer() _Service_ReportStatus($SERVICE_STOP_PENDING, $NO_ERROR, $iServiceCounter) $iServiceCounter += -100EndFunc Func _Stopping() _Service_ReportStatus($SERVICE_STOP_PENDING, $NO_ERROR, 3000) EndFunc

Разберу подробнее момент запуска приложения. Он начинается после операции $bServiceRunning = True и превращается в, казалось бы, бесконечный цикл. На самом деле этот процесс прервется, как только служба получит сигнал о завершении — будь то выход из системы или остановка вручную.

Поскольку программа для скрипта является внешней (powershell.exe), то после выхода из цикла нам нужно закончить ее работу с помощью ProcessClose.

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

Оно работает!

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

Но зато он дает полный контроль над происходящим. Да и сделать в итоге можно куда больше — от уведомления в Telegram о сбое службы до IPC-взаимодействия с другими программами.

И вдобавок — на скриптовом языке, без установки и изучения Visual Studio.

Расскажите, а вам приходилось превращать скрипты и приложения в службы?

Источник: https://habr.com/ru/company/pc-administrator/blog/421019/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.