Перейти к содержимому

Запустить программу как службу

  • автор:

Практическое руководство. Запуск служб

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

  • Службы рабочей роли в .NET
  • Создание службы Windows с использованием BackgroundService

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

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

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

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

Вы можете задать свойство StartType в классе ServiceInstaller, чтобы определить способ запуска службы — вручную или автоматически.

Указание способа запуска службы

  1. Создав службу, добавьте для нее необходимые установщики. Дополнительные сведения см. в разделе Практическое руководство. Добавление установщиков в приложение-службу.
  2. В конструкторе щелкните установщик процессов службы, с которой вы работаете.
  3. В окне свойств задайте свойству StartType одно из следующих значений:
Чтобы установить службу Задайте это значение
При перезапуске компьютера Автоматический
При запуске службы с помощью явного действия пользователя Manual (Вручную)

Совет Чтобы полностью запретить запуск службы, можно задать свойству StartType значение Disabled (Отключено). Это можно сделать, если вы собираетесь перезагружать сервер несколько раз и хотите сэкономить время, запретив запуск служб, которые обычно запускаются одновременно.

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

Запуск службы из обозревателя сервера

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

Запуск службы из приложения «Службы»

  1. Откройте приложение Службы.
  2. Выберите службу в списке, щелкните ее правой кнопкой мыши и выберите Запуск.

Запуск службы из кода

  1. Создайте экземпляр класса ServiceController и настройте его для взаимодействия со службой, которой нужно управлять.
  2. Чтобы запустить службу, вызовите метод Start.

См. также

  • Знакомство с приложениями служб Windows
  • Практическое руководство. Создание служб Windows
  • Практическое руководство. Добавление установщиков в приложение-службу

Совместная работа с нами на GitHub

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

Запуск приложения как службы Windows

Запуск приложения как службы Windows

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

SC

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

sc create [ИМЯ СЛУЖБЫ] binPath=[ПУТЬ К ИСПОЛНЯЕМОМУ ФАЙЛУ] DisplayName=[ОТОБРАЖАЕМОЕ ИМЯ СЛУЖБЫ] type=own start=auto

Удаляется же служба еще проще:

sc delete [ИМЯ СЛУЖБЫ]

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

NSSM

  1. Предположим, нужно создать службу для веб-сервера nginx под Windows. Для этого, запускаем командную строку с правами администратора, и переходим в директорию с распакованным исполняемым файлом nssm.exe.
  2. Затем выполняем команду, начинающую установку службы:
nssm install nginx
  • Откроется окно с настройками создаваемой службы.

    На самой первой вкладке «Application«, в строке «Path» задается путь к исполняемому файлу, «Startup Directory» — рабочая директория, а «Arguments» — параметры запуска. В самом низу расположена строка «Service Name«, где задается имя создаваемого сервиса.

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

    Вкладка «Log on» позволяет указать пользователя, под которым будет запускаться служба.Заполним все нужные поля и выбрав нужные настройки, остается только нажать кнопку «Install service«, для установки службы.
  • После нажатия кнопки «Install service«, служба будет создана, но при этом запустить её нужно будет вручную (либо перезагрузить компьютер, чтобы служба с параметром запуска «Auto» запустилась при его запуске).
  • Так же удалить службу можно с помощью команды в командной строке:

    nssm remove [ИМЯ СЛУЖБЫ] confirm

    Как запустить приложение в виде службы Windows

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

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

    Для демонстрации возможностей NSSM попробуем запустить Блокнот Windows в качестве службы на Windows 8.1.

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

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

    запуск NSSM

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

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

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

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

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

    настройки выключения службы в NSSM

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

    настройки выхода для службы в NSSM

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

    вкладка I/O в NSSM

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

    вкладка Environment в NSSM

    Также можно не пользоваться графической оболочкой и сразу создать службу в консоли такой командой:

    nssm install notepad ″C:\Windows\system32\notepad.exe″

    Управление службой

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

    свойства службы

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

    служба NSSM в диспетчере задач

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

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

    удаление службы в NSSM

    Запуск службы в интерактивном режиме

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

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

    разрешаем службе взаимодействие с рабочим столом

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

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

    разрешаем запуск интерактивных служб

    После чего открываем консоль PowerShell и стартуем службу обнаружения командой:

    Start-Service -Name ui0detect

    включаем службу обнаружения

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

    окно обнаружения запуска интерактивной службы

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

    нулевой сеанс

    Такое вот интересное решение для запуска приложений в виде служб Windows. Не самое красивое, но вполне соответствующее своему названию ��

    Учебник. Создание приложения службы Windows

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

    • Службы рабочей роли в .NET
    • Создание службы Windows с использованием BackgroundService

    Из этой статьи вы узнаете, как создать в Visual Studio приложение службы Windows, которое записывает сообщения в журнал событий.

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

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

    1. В Visual Studio в меню Файл последовательно выберите пункты Создать>Проект (или нажмите клавиши CTRL + SHIFT + N ), чтобы открыть окно Новый проект.
    2. Найдите и выберите шаблон проекта Служба Windows (платформа .NET Framework).

    Примечание Если шаблон службы Windows не отображается, может потребоваться установить рабочую нагрузку разработка классических приложений .NET с помощью Visual Studio Installer.

    Переименование службы

    Измените имя службы с Service1 на MyNewService.

    1. В Обозреватель решений выберите Service1.cs или Service1.vb, а затем в контекстном меню выберите Переименовать. Переименуйте файл в MyNewService.cs или MyNewService.vb, а затем нажмите клавишу ВВОД . Появится всплывающее окно, предлагающее переименовать все ссылки на элемент кода Service1.
    2. Выберите Да. Запрос на переименование
    3. На вкладке Проект выберите в контекстном меню пункт Свойства. В окне Свойства измените значение ServiceName на MyNewService. Свойства службы
    4. В меню Файл выберите команду Сохранить все.

    Добавление компонентов в службу

    В этом разделе к службе Windows будет добавлен настраиваемый журнал событий. Компонент EventLog — это пример типа компонента, который можно добавить в службу Windows.

    Добавление возможности работы с настраиваемым журналом событий

    1. В Обозреватель решений в контекстном меню myNewService.cs или MyNewService.vb выберите Просмотреть Designer.
    2. На панели элементов разверните узел Компоненты, а затем перетащите компонент EventLog на вкладку Service1.cs [Конструктор] или Service1.vb [Конструктор] .
    3. В Обозреватель решений в контекстном меню myNewService.cs или MyNewService.vb выберите Просмотреть код.
    4. Определите пользовательский журнал событий. Для C# измените существующий MyNewService() конструктор, как показано в следующем фрагменте кода. Для Visual Basic добавьте New() конструктор, как показано в следующем фрагменте кода.
    public MyNewService() < InitializeComponent(); eventLog1 = new System.Diagnostics.EventLog(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) < System.Diagnostics.EventLog.CreateEventSource( "MySource","MyNewLog"); >eventLog1.Source = "MySource"; eventLog1.Log = "MyNewLog"; > 
    ' To access the constructor in Visual Basic, select New from the ' method name drop-down list. Public Sub New() MyBase.New() InitializeComponent() Me.EventLog1 = New System.Diagnostics.EventLog If Not System.Diagnostics.EventLog.SourceExists("MySource") Then System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog") End If EventLog1.Source = "MySource" EventLog1.Log = "MyNewLog" End Sub 
    using System.Diagnostics; 
    Imports System.Diagnostics 

    Определение действий при запуске службы

    В редакторе кода для MyNewService.cs или MyNewService.vb найдите OnStart метод . Visual Studio автоматически создал пустое определение метода при создании проекта. Добавьте код, с помощью которой запись сохраняется в журнале событий при запуске службы:

    protected override void OnStart(string[] args)
    ' To access the OnStart in Visual Basic, select OnStart from the ' method name drop-down list. Protected Overrides Sub OnStart(ByVal args() As String) EventLog1.WriteEntry("In OnStart") End Sub 
    Опрос

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

    Для создания простого механизма опроса используйте компонент System.Timers.Timer. Таймер через определенные интервалы времени генерирует событие Elapsed, при возникновении которых служба может выполнять отслеживание. Компонент Timer используется следующим образом:

    • Задайте свойства компонента Timer в методе MyNewService.OnStart .
    • Запустите таймер, вызвав метод Start.
    Настройка механизма опроса
    1. Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Timers.
    using System.Timers; 
    Imports System.Timers 
    // Set up a timer that triggers every minute. Timer timer = new Timer(); timer.Interval = 60000; // 60 seconds timer.Elapsed += new ElapsedEventHandler(this.OnTimer); timer.Start(); 
    ' Set up a timer that triggers every minute. Dim timer As Timer = New Timer() timer.Interval = 60000 ' 60 seconds AddHandler timer.Elapsed, AddressOf Me.OnTimer timer.Start() 
    private int eventId = 1; 
    Private eventId As Integer = 1 
    public void OnTimer(object sender, ElapsedEventArgs args) < // TODO: Insert monitoring activities here. eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId++); >
    Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs) ' TODO: Insert monitoring activities here. eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId) eventId = eventId + 1 End Sub 

    Задачи можно выполнять с помощью фоновых рабочих потоков, а не выполнять всю работу в основном потоке. Для получения дополнительной информации см. System.ComponentModel.BackgroundWorker.

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

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

    protected override void OnStop()
    Protected Overrides Sub OnStop() EventLog1.WriteEntry("In OnStop.") End Sub 

    Определение других действий для службы

    Вы можете переопределить методы OnPause, OnContinue и OnShutdown, добавив дополнительные процессы обработки.

    В следующем коде показано, как можно переопределить OnContinue метод в MyNewService классе :

    protected override void OnContinue()
    Protected Overrides Sub OnContinue() EventLog1.WriteEntry("In OnContinue.") End Sub 

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

    Службы сообщают о своем состоянии диспетчеру служб, чтобы пользователь мог определить, работает ли служба правильно. По умолчанию служба, которая наследуется от ServiceBase, сообщает ограниченный набор состояний, включая SERVICE_STOPPED, SERVICE_PAUSED и SERVICE_RUNNING. Если служба запускается не сразу, полезно обеспечить сообщение состояния SERVICE_START_PENDING.

    Состояния ERVICE_START_PENDING и SERVICE_STOP_PENDING можно реализовать путем добавления кода, вызывающего функцию Windows SetServiceStatus.

    Реализация состояния ожидания службы

    1. Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Runtime.InteropServices.
    using System.Runtime.InteropServices; 
    Imports System.Runtime.InteropServices 
    public enum ServiceState < SERVICE_STOPPED = 0x00000001, SERVICE_START_PENDING = 0x00000002, SERVICE_STOP_PENDING = 0x00000003, SERVICE_RUNNING = 0x00000004, SERVICE_CONTINUE_PENDING = 0x00000005, SERVICE_PAUSE_PENDING = 0x00000006, SERVICE_PAUSED = 0x00000007, >[StructLayout(LayoutKind.Sequential)] public struct ServiceStatus < public int dwServiceType; public ServiceState dwCurrentState; public int dwControlsAccepted; public int dwWin32ExitCode; public int dwServiceSpecificExitCode; public int dwCheckPoint; public int dwWaitHint; >; 
    Public Enum ServiceState SERVICE_STOPPED = 1 SERVICE_START_PENDING = 2 SERVICE_STOP_PENDING = 3 SERVICE_RUNNING = 4 SERVICE_CONTINUE_PENDING = 5 SERVICE_PAUSE_PENDING = 6 SERVICE_PAUSED = 7 End Enum Public Structure ServiceStatus Public dwServiceType As Long Public dwCurrentState As ServiceState Public dwControlsAccepted As Long Public dwWin32ExitCode As Long Public dwServiceSpecificExitCode As Long Public dwCheckPoint As Long Public dwWaitHint As Long End Structure 

    Примечание Диспетчер служб использует члены dwWaitHint и dwCheckpoint структуры SERVICE_STATUS, чтобы определить время, в течение которого нужно ожидать запуска или завершения работы службы Windows. Если методы OnStart и OnStop выполняются долго, служба может запросить больше времени, повторно вызвав функцию SetServiceStatus с увеличенным значением dwCheckPoint .

    [DllImport("advapi32.dll", SetLastError = true)] private static extern bool SetServiceStatus(System.IntPtr handle, ref ServiceStatus serviceStatus); 
    Declare Auto Function SetServiceStatus Lib "advapi32.dll" (ByVal handle As IntPtr, ByRef serviceStatus As ServiceStatus) As Boolean 
    // Update the service state to Start Pending. ServiceStatus serviceStatus = new ServiceStatus(); serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING; serviceStatus.dwWaitHint = 100000; SetServiceStatus(this.ServiceHandle, ref serviceStatus); 
    ' Update the service state to Start Pending. Dim serviceStatus As ServiceStatus = New ServiceStatus() serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING serviceStatus.dwWaitHint = 100000 SetServiceStatus(Me.ServiceHandle, serviceStatus) 
    // Update the service state to Running. serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING; SetServiceStatus(this.ServiceHandle, ref serviceStatus); 
    ' Update the service state to Running. serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING SetServiceStatus(Me.ServiceHandle, serviceStatus) 
    // Update the service state to Stop Pending. ServiceStatus serviceStatus = new ServiceStatus(); serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING; serviceStatus.dwWaitHint = 100000; SetServiceStatus(this.ServiceHandle, ref serviceStatus); // Update the service state to Stopped. serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED; SetServiceStatus(this.ServiceHandle, ref serviceStatus); 
    ' Update the service state to Stop Pending. Dim serviceStatus As ServiceStatus = New ServiceStatus() serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING serviceStatus.dwWaitHint = 100000 SetServiceStatus(Me.ServiceHandle, serviceStatus) ' Update the service state to Stopped. serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED SetServiceStatus(Me.ServiceHandle, serviceStatus) 

    Добавление установщиков в службу

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

    1. В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор.
    2. В представлении Конструктор щелкните область фона правой кнопкой мыши и выберите в контекстном меню команду Добавить установщик. По умолчанию Visual Studio добавляет в проект класс компонента ProjectInstaller , содержащий два установщика. Они предназначены для установки службы и связанного со службой процесса.
    3. В представлении Конструктор для ProjectInstaller выберите serviceInstaller1 для проекта Visual C# или ServiceInstaller1 для проекта Visual Basic. Затем в контекстном меню выберите пункт Свойства.
    4. Убедитесь в том, что в окне Свойства свойство ServiceName имеет значение MyNewService.
    5. Введите для свойства Description какой нибудь текст, например Пример службы. Этот текст отображается в столбце Описание в окне Службы и помогает пользователю понять, для чего служба нужна. Описание службы в окне Службы.
    6. Введите текст для свойства DisplayName, например Отображаемое имя MyNewService. Этот текст отображается в столбце Отображаемое имя в окне Службы. Это имя может отличаться от значения свойства ServiceName, которое представляет собой имя, используемое в системе (например, когда вы запускаете службу с помощью команды net start ).
    7. Выберите для свойства StartType значение Automatic в раскрывающемся списке.
    8. В итоге окно Свойства должно выглядеть так: Свойства установщика для свойств установщика службы Windows
    9. В представлении Конструктор для ProjectInstaller выберите serviceProcessInstaller1 для проекта Visual C# или ServiceProcessInstaller1 для проекта Visual Basic. Затем в контекстном меню выберите пункт Свойства. Выберите для свойства Account значение LocalSystem в раскрывающемся списке. Это позволит установить и запускать службу от имени локальной системной учетной записи.

    Важно! У учетной записи LocalSystem имеется множество разрешений, включая разрешение на запись в журнал событий. Эту учетную запись следует использовать с осторожностью, поскольку это может увеличить риск атак с помощью вредоносных программ. Для других задач следует рассмотреть возможность использования учетной записи LocalService , которая аналогична учетной записи непривилегированного пользователя локального компьютера. Удаленным серверам при этом передаются учетные данные анонимного пользователя. В этом примере произойдет ошибка, если вы попытаетесь использовать учетную запись LocalService , так как для нее требуется разрешение на запись в журнал событий.

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

    Установка параметров запуска (необязательно)

    Прежде чем добавлять параметры запуска, решите, является ли это наилучшим способом передачи информации в службу. Хотя параметры запуска просты для использования и синтаксического анализа и пользователи могут легко их переопределять, для пользователей их поиск и применение могут оказаться затрудненными (без документации). Как правило, если вашей службе требуется всего несколько параметров запуска, то следует использовать реестр или файл конфигурации.

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

    Для каждой службы Windows создается запись в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Для хранения информации, к которой может обращаться ваша служба, в разделе службы можно использовать подраздел Parameters. Файлы конфигурации приложения для службы Windows можно использовать так же, как и для программ других типов. Пример кода см. в разделе ConfigurationManager.AppSettings.

    Добавление параметров запуска

    1. Выберите файл Program.cs или MyNewService.Designer.vb, а затем в контекстном меню выберите пункт Просмотреть код. Измените код метода Main , добавив входной параметр, который будет передаваться в конструктор службы:
    static void Main(string[] args) < ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] < new MyNewService(args) >; ServiceBase.Run(ServicesToRun); > 
    Shared Sub Main(ByVal cmdArgs() As String) Dim ServicesToRun() As System.ServiceProcess.ServiceBase = New System.ServiceProcess.ServiceBase() System.ServiceProcess.ServiceBase.Run(ServicesToRun) End Sub 
    using System.Diagnostics; public MyNewService(string[] args) < InitializeComponent(); string eventSourceName = "MySource"; string logName = "MyNewLog"; if (args.Length >0) < eventSourceName = args[0]; >if (args.Length > 1) < logName = args[1]; >eventLog1 = new EventLog(); if (!EventLog.SourceExists(eventSourceName)) < EventLog.CreateEventSource(eventSourceName, logName); >eventLog1.Source = eventSourceName; eventLog1.Log = logName; > 
    Imports System.Diagnostics Public Sub New(ByVal cmdArgs() As String) InitializeComponent() Dim eventSourceName As String = "MySource" Dim logName As String = "MyNewLog" If (cmdArgs.Count() > 0) Then eventSourceName = cmdArgs(0) End If If (cmdArgs.Count() > 1) Then logName = cmdArgs(1) End If eventLog1 = New EventLog() If (Not EventLog.SourceExists(eventSourceName)) Then EventLog.CreateEventSource(eventSourceName, logName) End If eventLog1.Source = eventSourceName eventLog1.Log = logName End Sub 
    protected override void OnBeforeInstall(IDictionary savedState)
    Protected Overrides Sub OnBeforeInstall(ByVal savedState As IDictionary) Dim parameter As String = "MySource1"" ""MyLogFile1" Context.Parameters("assemblypath") = """" + Context.Parameters("assemblypath") + """ """ + parameter + """" MyBase.OnBeforeInstall(savedState) End Sub 

    Сборка службы

    1. В обозревателе решений выберите пункт Свойства в контекстном меню проекта MyNewService. Отобразятся страницы свойств для проекта.
    2. На вкладке Приложение в списке Автоматически запускаемый объект выберите MyNewService.Program (или Sub Main для проекта Visual Basic).
    3. Чтобы выполнить сборку проекта, в обозревателе решений выберите в контекстном меню проекта пункт Сборка (или нажмите клавиши CTRL + SHIFT + B ).

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

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

    1. Откройте Командную строку разработчика Visual Studio с учетными данными администратора.
    2. В командной строке разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта (по умолчанию это подкаталог \bin\Debug проекта).
    3. Введите следующую команду:

    installutil MyNewService.exe 
    • Класс RunInstallerAttribute отсутствует в классе ProjectInstaller .
    • Значение атрибута отличается от true .
    • Класс ProjectInstaller не определен как public .

    Запуск и выполнение службы

    MyNewService в окне

    1. В Windows откройте классическое приложение Службы. Нажмите клавиши Windows+R, чтобы открыть окно Выполнить, введите services.msc и нажмите клавишу ВВОД или кнопку ОК. Заданное вами отображаемое имя службы отобразится в списке Службы, представленном в алфавитном порядке.
    2. Чтобы запустить службу, в ее контекстном меню выберите пункт Запустить.
    3. Чтобы остановить службу, в ее контекстном меню выберите пункт Остановить.
    4. Для запуска и остановки службы в командной строке можно использовать команды net start и net stop (необязательно).

    Проверка журнала событий для службы

    1. В Windows откройте классическое приложение Просмотр событий. Введите строку Просмотр событий в поле поиска Windows и выберите Просмотр событий в результатах поиска.

    Совет В Visual Studio доступ к журналам событий можно получить, открыв обозреватель сервера в меню Вид (или нажав клавиши CTRL + ALT + S ) и развернув узел Журналы событий для локального компьютера.

    Просмотр записей в журнале событий с помощью компонента

  • В средстве просмотра событий разверните узел Журналы приложений и служб.
  • Найдите в списке элемент MyNewLog (или MyLogFile1, если вы использовали процедуру добавления аргументов командной строки) и разверните его. Вы увидите записи для двух действий (запуск и остановка), которые выполнила ваша служба.
  • Очистка ресурсов

    Если приложение службы Windows вам больше не нужно, его можно удалить.

    1. Откройте Командную строку разработчика Visual Studio с учетными данными администратора.
    2. В окне Командная строка разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта.
    3. Введите следующую команду:

    installutil.exe /u MyNewService.exe 

    Следующие шаги

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

    • Создайте автономную программу установки, с помощью которой другие пользователи могут устанавливать вашу службу Windows. Создать установщик для службы Windows можно с помощью набора инструментов WiX. Другие идеи можно почерпнуть в статье о создании пакета установщика.
    • Изучите возможности компонента ServiceController, который позволяет отправлять команды в установленную службу.
    • Для создания журнала событий при установке приложения, а не во время его запуска, можно воспользоваться установщиком. В этом случае журнал событий удаляется установщиком при удалении приложения. Для получения дополнительной информации см. EventLogInstaller.

    См. также

    • Приложения служб Windows
    • Знакомство с приложениями служб Windows
    • Практическое руководство. Отладка приложений служб Windows
    • Службы (Windows)

    Совместная работа с нами на GitHub

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

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

    Ваш адрес email не будет опубликован. Обязательные поля помечены *