Как сделать свою службу windows

Содержание
  1. Как сделать свою службу windows
  2. Практическое руководство. Создание служб Windows How to: Create Windows Services
  3. Создание приложения службы Windows To create a Windows Service application
  4. Учебник. Создание приложения службы Windows Tutorial: Create a Windows service app
  5. Создание службы Create a service
  6. Переименование службы Rename the service
  7. Добавление компонентов в службу Add features to the service
  8. Добавление возможности работы с настраиваемым журналом событий Add custom event log functionality
  9. Определение действий при запуске службы Define what occurs when the service starts
  10. Опрос Polling
  11. Определение действий при остановке службы Define what occurs when the service is stopped
  12. Определение других действий для службы Define other actions for the service
  13. Установка состояния службы Set service status
  14. Реализация состояния ожидания службы Implement service pending status
  15. Добавление установщиков в службу Add installers to the service
  16. Установка параметров запуска (необязательно) (Optional) Set startup parameters
  17. Добавление параметров запуска To add startup parameters
  18. Сборка службы Build the service
  19. Установка службы Install the service
  20. Запуск и выполнение службы Start and run the service
  21. Проверка журнала событий для службы Verify the event log output of your service
  22. Очистка ресурсов Clean up resources
  23. Следующие шаги Next steps

Как сделать свою службу windows

Данный материал является зеркалом статьи сайта Заметки о WINDOWS с некоторыми примечаниями из личного опыта.

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

Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами — просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.

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

Для создания нового сервиса запускаем команду Sc create . Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:

sc create [ServiceName] [binPath= ]

ServiceName — указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath — указывает путь к исполняемому файлу службы.

Для примера создадим службу MyService, укажем отображаемое имя 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″

Ну и полностью удалить службу можно вот так:

Sc delete MyService

Примечание. Есть некоторые особенности использования утилиты sc. Например при создании сервиса в Windows XP необходимо ставить пробел перед аргументом, передаваемым параметру!

Если мы подадим команду:

C:\sc create Weblogic binPath=C:\Oracle\MiddleWare\user_projects\base_domain\startWeblogic.cmd DisplayName=»WebLogic» type=share start=auto error=ignore

В ответ получим help по использованию sc без какого либо сообщения об ошибке:

Подаем ту же команду вставив пробелы после символа «=»:

C:\>sc create Weblogic binPath= C:\Oracle\MiddleWare\user_projects\base_domain\startWeblogic.cmd DisplayName= «WebLogic» type= share start= auto error= ignore

[SC] CreateService SUCCESS

Вот такая недокументированная особенность.

Так же необходимо внимательно относится к прочим параметрам. В случае приведенном ниже изменены значения параметров start и type:

[SC] CreateService FAILED 87:

и после двоеточия никаких пояснений.

Подробное значение параметров можно посмотреть здесь или здесь.

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

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

Для перезагрузки службы:

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

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

sc enumdepend Lanmanserver

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

Для завершения и определения зависимостей сервера можно воспользоваться подкомандой qc, как показано ниже

sc qc Lanmanserver

Эта команда выдает девять строчек информации о службе, одна из которых DEPENDENCIES. При запуске этой команды выясняется, что сервер не зависит ни от каких служб. Чтобы узнать, какие службы имеют более одной зависимости, можно протестировать диспетчер на службе Netlogon. Мы увидим, что служба Netlogon для начала работы требует запуска служб и сервера, и Workstation.

Иногда зависимости бывают более сложными. Например, некоторые службы могут начать работу, только если запущена одна из трех других служб. Запуск всех трех необязателен, вполне достаточно одной. Можно проинструктировать Windows по поводу такой динамики, информируя систему о том, что данная служба находится в зависимости от группы служб. В системе Windows имеется целый ряд таких служб, как, например, SCSI CDROM Class, SCSI miniport, Parallel arbitrator, NetBIOSGroup, NDIS, а также службы первичного диска и многие другие. Все эти службы и драйверы можно увидеть в списке групп, набрав

sc query type= service?driver?all group=

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

sc query type= all group=

Названия групп значения не имеют. Можно добавлять службы в имеющиеся группы или создавать новые группы служб, добавив команду group= groupname в команду SC Create или используя SC Config для сохранения службы в какую-либо группу. Например, чтобы добавить службу Webimagemailer в новую группу под названием unimportant, надо набрать

sc config webimagemailer group= unimportant

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

Кроме того, можно сделать так, чтобы не происходила загрузка службы Webimagemailer без необходимой группы служб. Чтобы определить фиктивную группу Webstartup, воспользуемся параметром depends= webstartup. Чтобы указать Windows, что Webstartup — это группа, а не еще одна служба, следует перед ее именем поставить знак «плюс». Например, для перенастройки службы Webimagemailer на зависимость от группы запуска Webstartup, надо набрать

sc config webimagemailer depends= +webstartup

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

PowerShell может почти все, в том числе и управлять службами Windows. Создать новую службу можно с помощью командлета New-Service . Создадим такой же сервис, как и в предыдущем примере, только добавим к нему описание (Description):

New-Service -Name MyService -BinaryPathName C:\MyService\MyService.exe`
-DisplayName ″My New Service″ -Description ″Very Important Service . ″

Изменить параметры службы можно командлетом Set-Service :

Set-Service -Name MyService -Description ″Not Very Important Service″ -StartupType Manual

В принципе PowerShell имеет примерно такой же функционал как и Sc.exe, разве что позволяет добавить описание. А вот для удаления служб в PS простого способа нет, придется воспользоваться вот такой конструкцией:

(Get-WmiObject win32_service -Filter ″name=′MyService′″).delete()

Практическое руководство. Создание служб Windows How to: Create Windows Services

При создании службы можно использовать шаблон проекта Visual Studio, который называется Служба Windows. When you create a service, you can use a Visual Studio project template called Windows Service. Этот шаблон автоматически выполняет основную часть работы, ссылаясь на необходимые классы и пространства имен, устанавливая наследование от базового класса для служб и переопределяя некоторые методы, которые вы обычно хотите переопределять. This template automatically does much of the work for you by referencing the appropriate classes and namespaces, setting up the inheritance from the base class for services, and overriding several of the methods you’re likely to want to override.

Шаблон проекта «Службы Windows» в экспресс-выпуске Visual Studio отсутствует. The Windows Services project template is not available in the Express edition of Visual Studio.

Для создания функциональной службы необходимо выполнить, как минимум, следующее: At a minimum, to create a functional service you must:

Задайте свойство ServiceName. Set the ServiceName property.

Создайте установщики, необходимые для приложения службы. Create the necessary installers for your service application.

Переопределите и задайте код для методов OnStart и OnStop для настройки режимов поведения службы. Override and specify code for the OnStart and OnStop methods to customize the ways in which your service behaves.

Создание приложения службы Windows To create a Windows Service application

Создайте проект Служба Windows. Create a Windows Service project.

Инструкции по созданию службы без использования шаблона см. в разделе Практический пример. Создание служб программным способом. For instructions on writing a service without using the template, see How to: Write Services Programmatically.

В окне Свойства задайте для своей службы свойство ServiceName. In the Properties window, set the ServiceName property for your service.

Значение ServiceName свойства всегда должно соответствовать имени, указанному в классах установщика. The value of the ServiceName property must always match the name recorded in the installer classes. При изменении этого свойства необходимо также обновить свойство ServiceName классов установщика. If you change this property, you must update the ServiceName property of installer classes as well.

Установите любые из следующих свойств для определения режима работы службы. Set any of the following properties to determine how your service will function.

Свойство. Property Параметр Setting
CanStop True , чтобы указать, что служба может принимать запросы на останов работы; false для предотвращения останова службы. True to indicate that the service will accept requests to stop running; false to prevent the service from being stopped.
CanShutdown True , чтобы указать, что служба хочет принимать уведомления о выключении компьютера, на котором она работает, позволяя ему вызывать процедуру OnShutdown. True to indicate that the service wants to receive notification when the computer on which it lives shuts down, enabling it to call the OnShutdown procedure.
CanPauseAndContinue True , чтобы указать, что служба может принимать запросы на приостановку или возобновление выполнения; false для предотвращения приостановки и возобновления работы службы. True to indicate that the service will accept requests to pause or to resume running; false to prevent the service from being paused and resumed.
CanHandlePowerEvent True , чтобы указать, что служба может обрабатывать уведомления об изменениях состояния питания компьютера; false , чтобы не сообщать службе об этих изменениях. True to indicate that the service can handle notification of changes to the computer’s power status; false to prevent the service from being notified of these changes.
AutoLog True для внесения информационных записей в журнал событий приложения, когда служба выполняет некоторое действие; false для отключения этой функции. True to write informational entries to the Application event log when your service performs an action; false to disable this functionality. Дополнительные сведения см. в разделе Практическое руководство. Запись сведений о службах в журнал. For more information, see How to: Log Information About Services. Примечание. По умолчанию свойство AutoLog имеет значение true . Note: By default, AutoLog is set to true .

Когда CanStop или CanPauseAndContinue имеют значение false , диспетчер служб будет отключать пункты меню, отвечающие за остановку, приостановку или возобновление работы службы. When CanStop or CanPauseAndContinue are set to false , the Service Control Manager will disable the corresponding menu options to stop, pause, or continue the service.

Откройте редактор кода и введите данные для выполнения операций для процедур OnStart и OnStop. Access the Code Editor and fill in the processing you want for the OnStart and OnStop procedures.

Переопределите все прочие методы, для которых необходимо определить функциональные возможности. Override any other methods for which you want to define functionality.

Добавить установщики, необходимые для приложения службы. Add the necessary installers for your service application. Дополнительные сведения см. в разделе Практическое руководство. Добавление установщиков в приложение-службу. For more information, see How to: Add Installers to Your Service Application.

Скомпилируйте проект, выбрав в меню Сборка пункт Собрать решение. Build your project by selecting Build Solution from the Build menu.

Не нажимайте клавишу F5 для запуска проекта — таким способом нельзя запустить проект службы. Do not press F5 to run your project — you cannot run a service project in this way.

Установите службу. Install the service. Дополнительные сведения см. в разделе Практическое руководство. Установка и удаление служб. For more information, see How to: Install and Uninstall Services.

Учебник. Создание приложения службы Windows Tutorial: Create a Windows service app

Из этой статьи вы узнаете, как создать в Visual Studio приложение службы Windows, которое записывает сообщения в журнал событий. This article demonstrates how to create a Windows service app in Visual Studio that writes messages to an event log.

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

Для начала создайте проект и настройте значения, необходимые для правильной работы службы. To begin, create the project and set the values that are required for the service to function correctly.

В Visual Studio в меню Файл последовательно выберите пункты Создать > Проект (или нажмите клавиши CTRL+SHIFT+N), чтобы открыть окно Новый проект. From the Visual Studio File menu, select New > Project (or press Ctrl+Shift+N) to open the New Project window.

Найдите и выберите шаблон проекта Служба Windows (.NET Framework) . Navigate to and select the Windows Service (.NET Framework) project template. Чтобы найти его, разверните узел Установленные, затем узел Visual C# или Visual Basic и выберите Рабочий стол Windows. To find it, expand Installed and Visual C# or Visual Basic, then select Windows Desktop. Можно также ввести запрос Служба Windows в поле поиска в правом верхнем углу и нажать клавишу ВВОД. Or, enter Windows Service in the search box on the upper right and press Enter.

Если вы не видите здесь шаблон Служба Windows, попробуйте установить рабочую нагрузку Разработка классических приложений .NET. If you don’t see the Windows Service template, you may need to install the .NET desktop development workload:

В диалоговом окне Новый проект выберите ссылку Открыть установщик Visual Studio. In the New Project dialog, select Open Visual Studio Installer on the lower left. Выберите рабочую нагрузку Разработка классических приложений .NET и нажмите кнопку Изменить. Select the .NET desktop development workload, and then select Modify.

В поле Имя введите MyNewService, а затем нажмите кнопку ОК. For Name, enter MyNewService, and then select OK.

Откроется вкладка Проект (Service1.cs [Проект] или Service1.vb [Проект] ). The Design tab appears (Service1.cs [Design] or Service1.vb [Design]).

Этот шаблон проекта содержит класс компонента с именем Service1 , наследуемый от System.ServiceProcess.ServiceBase. The project template includes a component class named Service1 that inherits from System.ServiceProcess.ServiceBase. В нем собран основной служебный код, в том числе код для запуска службы. It includes much of the basic service code, such as the code to start the service.

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

Измените имя службы с Service1 на MyNewService. Rename the service from Service1 to MyNewService.

В обозревателе решений выберите файл Service1.cs или Service1.vb, а затем выберите в контекстном меню команду Переименовать. In Solution Explorer, select Service1.cs, or Service1.vb, and choose Rename from the shortcut menu. Переименуйте файл в MyNewService.cs или MyNewService.vb и нажмите клавишу ВВОД. Rename the file to MyNewService.cs, or MyNewService.vb, and then press Enter

Появится всплывающее окно, предлагающее переименовать все ссылки на элемент кода Service1. A pop-up window appears asking whether you would like to rename all references to the code element Service1.

Выберите Да. In the pop-up window, select Yes.

На вкладке Проект выберите в контекстном меню пункт Свойства. In the Design tab, select Properties from the shortcut menu. В окне Свойства измените значение ServiceName на MyNewService. From the Properties window, change the ServiceName value to MyNewService.

В меню Файл выберите команду Сохранить все. Select Save All from the File menu.

Добавление компонентов в службу Add features to the service

В этом разделе к службе Windows будет добавлен настраиваемый журнал событий. In this section, you add a custom event log to the Windows service. Компонент EventLog — это пример типа компонента, который можно добавить в службу Windows. The EventLog component is an example of the type of component you can add to a Windows service.

Добавление возможности работы с настраиваемым журналом событий Add custom event log functionality

В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор. In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Designer.

На панели элементов разверните раздел Компоненты и перетащите компонент EventLog на вкладку Service1.cs [Проект] или Service1.vb [Проект] . In Toolbox, expand Components, and then drag the EventLog component to the Service1.cs [Design], or Service1.vb [Design] tab.

В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Просмотреть код. In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Code.

Определите пользовательский журнал событий. Define a custom event log. Для C# измените существующий конструктор MyNewService() . Для Visual Basic добавьте конструктор New() . For C#, edit the existing MyNewService() constructor; for Visual Basic, add the New() constructor:

Добавьте оператор using в файл MyNewService.cs (если его еще нет) или оператор Imports в файл MyNewService.vb для пространства имен System.Diagnostics. Add a using statement to MyNewService.cs (if it doesn’t already exist), or an Imports statement MyNewService.vb, for the System.Diagnostics namespace:

В меню Файл выберите команду Сохранить все. Select Save All from the File menu.

Определение действий при запуске службы Define what occurs when the service starts

В редакторе кода для файла MyNewService.cs или MyNewService.vb найдите метод OnStart. Пустое определение метода было автоматически добавлено при создании проекта в Visual Studio. In the code editor for MyNewService.cs or MyNewService.vb, locate the OnStart method; Visual Studio automatically created an empty method definition when you created the project. Добавьте код, с помощью которой запись сохраняется в журнале событий при запуске службы: Add code that writes an entry to the event log when the service starts:

Опрос Polling

Так как приложение службы предполагает длительное время выполнения, оно обычно опрашивает или отслеживает систему. Отслеживание настраивается в методе OnStart. Because a service application is designed to be long-running, it usually polls or monitors the system, which you set up in the OnStart method. После начала работы службы метод OnStart должен возвращать управление операционной системе, чтобы она не блокировалась. The OnStart method must return to the operating system after the service’s operation has begun so that the system isn’t blocked.

Для создания простого механизма опроса используйте компонент System.Timers.Timer. To set up a simple polling mechanism, use the System.Timers.Timer component. Таймер через определенные интервалы времени генерирует событие Elapsed, при возникновении которых служба может выполнять отслеживание. The timer raises an Elapsed event at regular intervals, at which time your service can do its monitoring. Компонент Timer используется следующим образом: You use the Timer component as follows:

  • Задайте свойства компонента Timer в методе MyNewService.OnStart . Set the properties of the Timer component in the MyNewService.OnStart method.
  • Запустите таймер, вызвав метод Start. Start the timer by calling the Start method.
Настройка механизма опроса. Set up the polling mechanism.

Чтобы настроить механизм опроса, добавьте следующий код в событие MyNewService.OnStart : Add the following code in the MyNewService.OnStart event to set up the polling mechanism:

Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Timers. Add a using statement to MyNewService.cs, or an Imports statement to MyNewService.vb, for the System.Timers namespace:

В классе MyNewService добавьте метод OnTimer для обработки события Timer.Elapsed. In the MyNewService class, add the OnTimer method to handle the Timer.Elapsed event:

В класс MyNewService добавьте переменную-член. In the MyNewService class, add a member variable. Она содержит идентификатор следующего события, которое сохраняется в журнале событий. It contains the identifier of the next event to write into the event log:

Задачи можно выполнять с помощью фоновых рабочих потоков, а не выполнять всю работу в основном потоке. Instead of running all your work on the main thread, you can run tasks by using background worker threads. Для получения дополнительной информации см. System.ComponentModel.BackgroundWorker. For more information, see System.ComponentModel.BackgroundWorker.

Определение действий при остановке службы Define what occurs when the service is stopped

Вставьте в метод OnStop строку кода, с помощью которой запись сохраняется в журнале событий при остановке службы: Insert a line of code in the OnStop method that adds an entry to the event log when the service is stopped:

Определение других действий для службы Define other actions for the service

Вы можете переопределить методы OnPause, OnContinue и OnShutdown, добавив дополнительные процессы обработки. You can override the OnPause, OnContinue, and OnShutdown methods to define additional processing for your component.

Следующий код показывает, как можно переопределить метод OnContinue в классе MyNewService : The following code shows how you to override the OnContinue method in the MyNewService class:

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

Службы сообщают о своем состоянии диспетчеру служб, чтобы пользователь мог определить, работает ли служба правильно. Services report their status to the Service Control Manager so that a user can tell whether a service is functioning correctly. По умолчанию служба, которая наследуется от ServiceBase, сообщает ограниченный набор состояний, включая SERVICE_STOPPED, SERVICE_PAUSED и SERVICE_RUNNING. By default, a service that inherits from ServiceBase reports a limited set of status settings, which include SERVICE_STOPPED, SERVICE_PAUSED, and SERVICE_RUNNING. Если служба запускается не сразу, полезно обеспечить сообщение состояния SERVICE_START_PENDING. If a service takes a while to start up, it’s useful to report a SERVICE_START_PENDING status.

Состояния ERVICE_START_PENDING и SERVICE_STOP_PENDING можно реализовать путем добавления кода, вызывающего функцию Windows SetServiceStatus. You can implement the SERVICE_START_PENDING and SERVICE_STOP_PENDING status settings by adding code that calls the Windows SetServiceStatus function.

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

Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Runtime.InteropServices. Add a using statement to MyNewService.cs, or an Imports statement to MyNewService.vb, for the System.Runtime.InteropServices namespace:

Добавьте следующий код в файл MyNewService.cs или MyNewService.vb для объявления значений ServiceState и добавления структуры для состояния, которая будет использоваться при вызове неуправляемого кода: Add the following code to MyNewService.cs, or MyNewService.vb, to declare the ServiceState values and to add a structure for the status, which you’ll use in a platform invoke call:

Диспетчер служб использует члены dwWaitHint и dwCheckpoint структуры SERVICE_STATUS, чтобы определить время, в течение которого нужно ожидать запуска или завершения работы службы Windows. The Service Control Manager uses the dwWaitHint and dwCheckpoint members of the SERVICE_STATUS structure to determine how much time to wait for a Windows service to start or shut down. Если методы OnStart и OnStop выполняются долго, служба может запросить больше времени, повторно вызвав функцию SetServiceStatus с увеличенным значением dwCheckPoint . If your OnStart and OnStop methods run long, your service can request more time by calling SetServiceStatus again with an incremented dwCheckPoint value.

В классе MyNewService объявите функцию SetServiceStatus с помощью вызова неуправляемого кода: In the MyNewService class, declare the SetServiceStatus function by using platform invoke:

Для реализации состояния SERVICE_START_PENDING добавьте следующий код в начало метода OnStart: To implement the SERVICE_START_PENDING status, add the following code to the beginning of the OnStart method:

Для установки состояния SERVICE_RUNNING добавьте код в конце метода OnStart : Add code to the end of the OnStart method to set the status to SERVICE_RUNNING:

Если метод OnStop выполняется долго, повторите данную процедуру для OnStop (необязательно). (Optional) If OnStop is a long-running method, repeat this procedure in the OnStop method. Реализуйте состояние SERVICE_STOP_PENDING и обеспечьте возврат состояния SERVICE_STOPPED до того, как метод OnStop вернет управление. Implement the SERVICE_STOP_PENDING status and return the SERVICE_STOPPED status before the OnStop method exits.

Пример: For example:

Добавление установщиков в службу Add installers to the service

Перед тем как запускать службу Windows, ее нужно установить. При этом она регистрируется в диспетчере служб. Before you run a Windows service, you need to install it, which registers it with the Service Control Manager. В проект можно добавить установщики, которые обрабатывают сведения о регистрации. Add installers to your project to handle the registration details.

В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор. In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Designer.

В представлении Конструктор щелкните область фона правой кнопкой мыши и выберите в контекстном меню команду Добавить установщик. In the Design view, select the background area, then choose Add Installer from the shortcut menu.

По умолчанию Visual Studio добавляет в проект класс компонента ProjectInstaller , содержащий два установщика. By default, Visual Studio adds a component class named ProjectInstaller , which contains two installers, to your project. Они предназначены для установки службы и связанного со службой процесса. These installers are for your service and for the service’s associated process.

В представлении Конструктор для ProjectInstaller выберите serviceInstaller1 для проекта Visual C# или ServiceInstaller1 для проекта Visual Basic. Затем в контекстном меню выберите пункт Свойства. In the Design view for ProjectInstaller, select serviceInstaller1 for a Visual C# project, or ServiceInstaller1 for a Visual Basic project, then choose Properties from the shortcut menu.

Убедитесь в том, что в окне Свойства свойство ServiceName имеет значение MyNewService. In the Properties window, verify the ServiceName property is set to MyNewService.

Введите для свойства Description какой нибудь текст, например Пример службы. Add text to the Description property, such as A sample service.

Этот текст отображается в столбце Описание в окне Службы и помогает пользователю понять, для чего служба нужна. This text appears in the Description column of the Services window and describes the service to the user.

Введите текст для свойства DisplayName, Add text to the DisplayName property. например Отображаемое имя MyNewService. For example, MyNewService Display Name.

Этот текст отображается в столбце Отображаемое имя в окне Службы. This text appears in the Display Name column of the Services window. Это имя может отличаться от значения свойства ServiceName, которое представляет собой имя, используемое в системе (например, когда вы запускаете службу с помощью команды net start ). This name can be different from the ServiceName property, which is the name the system uses (for example, the name you use for the net start command to start your service).

Выберите для свойства StartType значение Automatic в раскрывающемся списке. Set the StartType property to Automatic from the drop-down list.

В итоге окно Свойства должно выглядеть так: When you’re finished, the Properties windows should look like the following figure:

В представлении Конструктор для ProjectInstaller выберите serviceProcessInstaller1 для проекта Visual C# или ServiceProcessInstaller1 для проекта Visual Basic. Затем в контекстном меню выберите пункт Свойства. In the Design view for ProjectInstaller, choose serviceProcessInstaller1 for a Visual C# project, or ServiceProcessInstaller1 for a Visual Basic project, then choose Properties from the shortcut menu. Выберите для свойства Account значение LocalSystem в раскрывающемся списке. Set the Account property to LocalSystem from the drop-down list.

Это позволит установить и запускать службу от имени локальной системной учетной записи. This setting installs the service and runs it by using the local system account.

У учетной записи LocalSystem имеется множество разрешений, включая разрешение на запись в журнал событий. The LocalSystem account has broad permissions, including the ability to write to the event log. Эту учетную запись следует использовать с осторожностью, поскольку это может увеличить риск атак с помощью вредоносных программ. Use this account with caution, because it might increase your risk of attacks from malicious software. Для других задач следует рассмотреть возможность использования учетной записи LocalService , которая аналогична учетной записи непривилегированного пользователя локального компьютера. Удаленным серверам при этом передаются учетные данные анонимного пользователя. For other tasks, consider using the LocalService account, which acts as a non-privileged user on the local computer and presents anonymous credentials to any remote server. В этом примере произойдет ошибка, если вы попытаетесь использовать учетную запись LocalService , так как для нее требуется разрешение на запись в журнал событий. This example fails if you try to use the LocalService account, because it needs permission to write to the event log.

Дополнительные сведения об установщиках см. в руководстве по добавлению установщиков в приложение-службу. For more information about installers, see How to: Add installers to your service application.

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

Прежде чем добавлять параметры запуска, решите, является ли это наилучшим способом передачи информации в службу. Before you decide to add startup parameters, consider whether it’s the best way to pass information to your service. Хотя параметры запуска просты для использования и синтаксического анализа и пользователи могут легко их переопределять, для пользователей их поиск и применение могут оказаться затрудненными (без документации). Although they’re easy to use and parse, and a user can easily override them, they might be harder for a user to discover and use without documentation. Как правило, если вашей службе требуется всего несколько параметров запуска, то следует использовать реестр или файл конфигурации. Generally, if your service requires more than just a few startup parameters, you should use the registry or a configuration file instead.

Служба Windows может принимать аргументы командной строки или параметры запуска. A Windows service can accept command-line arguments, or startup parameters. При добавлении кода в параметры запуска процесса пользователь может запускать службу со своими собственными специальными параметрами из окна свойств службы. When you add code to process startup parameters, a user can start your service with their own custom startup parameters in the service properties window. Однако эти параметры запуска не сохраняются при следующем запуске службы. However, these startup parameters aren’t persisted the next time the service starts. Задать постоянные параметры запуска можно в реестре. To set startup parameters permanently, set them in the registry.

Для каждой службы Windows создается запись в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Each Windows service has a registry entry under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services subkey. Для хранения информации, к которой может обращаться ваша служба, в разделе службы можно использовать подраздел Parameters. Under each service’s subkey, use the Parameters subkey to store information that your service can access. Файлы конфигурации приложения для службы Windows можно использовать так же, как и для программ других типов. You can use application configuration files for a Windows service the same way you do for other types of programs. Пример кода см. в разделе ConfigurationManager.AppSettings. For sample code, see ConfigurationManager.AppSettings.

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

Выберите файл Program.cs или MyNewService.Designer.vb, а затем в контекстном меню выберите пункт Просмотреть код. Select Program.cs, or MyNewService.Designer.vb, then choose View Code from the shortcut menu. Измените код метода Main , добавив входной параметр, который будет передаваться в конструктор службы: In the Main method, change the code to add an input parameter and pass it to the service constructor:

В файле MyNewService.cs или MyNewService.vb измените конструктор MyNewService для обработки входного параметра следующим образом: In MyNewService.cs, or MyNewService.vb, change the MyNewService constructor to process the input parameter as follows:

Этот код задает имя источника события и журнала в соответствии с указанными пользователем параметрами запуска. This code sets the event source and log name according to the startup parameters that the user supplies. Если аргументы не заданы, используются значения по умолчанию. If no arguments are supplied, it uses default values.

Чтобы задать аргументы командной строки, добавьте следующий код в класс ProjectInstaller в файле ProjectInstaller.cs или ProjectInstaller.vb: To specify the command-line arguments, add the following code to the ProjectInstaller class in ProjectInstaller.cs, or ProjectInstaller.vb:

Как правило, это значение представляет собой полный путь к исполняемому файлу службы Windows. Typically, this value contains the full path to the executable for the Windows service. Для правильного запуска службы пользователь должен заключить путь и каждый параметр в кавычки. For the service to start up correctly, the user must supply quotation marks for the path and each individual parameter. Чтобы изменить параметры запуска службы Windows, пользователь может настроить параметры в разделе реестра ImagePath. A user can change the parameters in the ImagePath registry entry to change the startup parameters for the Windows service. Однако лучше изменять их программными средствами и создать для пользователей удобный интерфейс для этой возможности, например в виде программы управления или настройки. However, a better way is to change the value programmatically and expose the functionality in a user-friendly way, such as by using a management or configuration utility.

Сборка службы Build the service

В обозревателе решений выберите пункт Свойства в контекстном меню проекта MyNewService. In Solution Explorer, choose Properties from the shortcut menu for the MyNewService project.

Отобразятся страницы свойств для проекта. The property pages for your project appear.

На вкладке Приложение в списке Автоматически запускаемый объект выберите MyNewService.Program (или Sub Main для проекта Visual Basic). On the Application tab, in the Startup object list, choose MyNewService.Program, or Sub Main for Visual Basic projects.

Чтобы выполнить сборку проекта, в обозревателе решений выберите в контекстном меню проекта пункт Сборка (или нажмите клавиши CTRL+SHIFT+B). To build the project, in Solution Explorer, choose Build from the shortcut menu for your project (or press Ctrl+Shift+B).

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

После создания службы Windows ее можно установить. Now that you’ve built the Windows service, you can install it. Чтобы установить службу Windows, необходимо иметь разрешения администратора на том компьютере, где выполняется установка. To install a Windows service, you must have administrator credentials on the computer where it’s installed.

Откройте Командную строку разработчика Visual Studio с учетными данными администратора. Open Developer Command Prompt for Visual Studio with administrative credentials.

В командной строке разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта (по умолчанию это подкаталог \bin\Debug проекта). In Developer Command Prompt for Visual Studio, navigate to the folder that contains your project’s output (by default, the \bin\Debug subdirectory of your project).

Введите следующую команду: Enter the following command:

Если служба установлена успешно, команда сообщит об успешном выполнении. If the service installs successfully, the command reports success.

Если система не может найти файл installutil.exe, убедитесь в том, что он есть на вашем компьютере. If the system can’t find installutil.exe, make sure that it exists on your computer. Это средство устанавливается вместе с платформой .NET Framework в папке %windir%\Microsoft.NET\Framework[64]\ . This tool is installed with the .NET Framework to the folder %windir%\Microsoft.NET\Framework[64]\ . Например, для 64-разрядной версии по умолчанию используется путь %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe. For example, the default path for the 64-bit version is %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe.

Если процесс installutil.exe завершается сбоем, найдите причину в журнале установки. If the installutil.exe process fails, check the install log to find out why. По умолчанию журнал находится в той же папке, что и исполняемый файл службы. By default, the log is in the same folder as the service executable. Установка может завершиться сбоем по указанным ниже причинам. The installation can fail if:

  • Класс RunInstallerAttribute отсутствует в классе ProjectInstaller . The RunInstallerAttribute class isn’t present on the ProjectInstaller class.
  • Значение атрибута отличается от true . The attribute isn’t set to true .
  • Класс ProjectInstaller не определен как public . The ProjectInstaller class isn’t defined as public .

Запуск и выполнение службы Start and run the service

В Windows откройте классическое приложение Службы. In Windows, open the Services desktop app. Нажмите клавиши Windows+R, чтобы открыть окно Выполнить, введите services.msc и нажмите клавишу ВВОД или кнопку ОК. Press Windows+R to open the Run box, enter services.msc, and then press Enter or select OK.

Заданное вами отображаемое имя службы отобразится в списке Службы, представленном в алфавитном порядке. You should see your service listed in Services, displayed alphabetically by the display name that you set for it.

Чтобы запустить службу, в ее контекстном меню выберите пункт Запустить. To start the service, choose Start from the service’s shortcut menu.

Чтобы остановить службу, в ее контекстном меню выберите пункт Остановить. To stop the service, choose Stop from the service’s shortcut menu.

Для запуска и остановки службы в командной строке можно использовать команды net start и net stop (необязательно). (Optional) From the command line, use the commands net start and net stop to start and stop your service.

Проверка журнала событий для службы Verify the event log output of your service

В Windows откройте классическое приложение Просмотр событий. In Windows, open the Event Viewer desktop app. Введите строку Просмотр событий в поле поиска Windows и выберите Просмотр событий в результатах поиска. Enter Event Viewer in the Windows search bar, and then select Event Viewer from the search results.

В Visual Studio доступ к журналам событий можно получить, открыв обозреватель сервера в меню Вид (или нажав клавиши CTRL+ALT+S) и развернув узел Журналы событий для локального компьютера. In Visual Studio, you can access event logs by opening Server Explorer from the View menu (or press Ctrl+Alt+S) and expanding the Event Logs node for the local computer.

В средстве просмотра событий разверните узел Журналы приложений и служб. In Event Viewer, expand Applications and Services Logs.

Найдите в списке элемент MyNewLog (или MyLogFile1, если вы использовали процедуру добавления аргументов командной строки) и разверните его. Locate the listing for MyNewLog (or MyLogFile1 if you followed the procedure to add command-line arguments) and expand it. Вы увидите записи для двух действий (запуск и остановка), которые выполнила ваша служба. You should see the entries for the two actions (start and stop) that your service performed.

Очистка ресурсов Clean up resources

Если приложение службы Windows вам больше не нужно, его можно удалить. If you no longer need the Windows service app, you can remove it.

Откройте Командную строку разработчика Visual Studio с учетными данными администратора. Open Developer Command Prompt for Visual Studio with administrative credentials.

В окне Командная строка разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта. In the Developer Command Prompt for Visual Studio window, navigate to the folder that contains your project’s output.

Введите следующую команду: Enter the following command:

Если служба удалена успешно, команда сообщит об этом. If the service uninstalls successfully, the command reports that your service was successfully removed. Дополнительные сведения см. в разделе Практическое руководство. Установка и удаление служб. For more information, see How to: Install and uninstall services.

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

Теперь, после создания службы, можно выполнить указанные ниже действия. Now that you’ve created the service, you can:

Создайте автономную программу установки, с помощью которой другие пользователи могут устанавливать вашу службу Windows. Create a standalone setup program for others to use to install your Windows service. Создать установщик для службы Windows можно с помощью набора инструментов WiX. Use the WiX Toolset to create an installer for a Windows service. Другие идеи можно почерпнуть в статье о создании пакета установщика. For other ideas, see Create an installer package.

Изучите возможности компонента ServiceController, который позволяет отправлять команды в установленную службу. Explore the ServiceController component, which enables you to send commands to the service you’ve installed.

Для создания журнала событий при установке приложения, а не во время его запуска, можно воспользоваться установщиком. Instead of creating the event log when the application runs, use an installer to create an event log when you install the application. В этом случае журнал событий удаляется установщиком при удалении приложения. The event log is deleted by the installer when you uninstall the application. Для получения дополнительной информации см. EventLogInstaller. For more information, see EventLogInstaller.

Читайте также:  Зачем нужна активация windows
Оцените статью