Как установить службу в windows 10
Перейти к содержимому

Как установить службу в windows 10

  • автор:

How to: Install and uninstall Windows services

This documentation isn’t for the latest version of Windows Service. For the latest content on Windows Services using BackgroundService and the Worker Service template, see:

  • Worker Services in .NET
  • Create a Windows Service using BackgroundService

If you’re developing a Windows service with .NET Framework, you can quickly install your service app by using the InstallUtil.exe command-line utility or PowerShell. Developers who want to release a Windows service that users can install and uninstall can use the free WiX Toolset or commercial tools like Advanced Installer, InstallShield, and others. For more information, see Create an installer package (Windows desktop).

If you want to uninstall a service from your computer, don’t follow the steps in this article. Instead, find out which program or software package installed the service, and then choose Apps in Settings to uninstall that program. Many services are integral parts of Windows; if you remove them, you might cause system instability.

To use the steps in this article, you first need to add a service installer to your Windows service. For more information, see Walkthrough: Creating a Windows service app.

You can’t run Windows service projects directly from the Visual Studio development environment by pressing F5 . Before you can run the project, you must install the service in the project.

You can use Server Explorer to verify that you’ve installed or uninstalled your service.

Install using InstallUtil.exe utility

  1. From the Start menu, select the Visual Studio version> directory, then select Developer Command Prompt for VS version>. The Developer Command Prompt for Visual Studio appears.
  2. Access the directory where your project’s compiled executable file is located.
  3. Run InstallUtil.exe from the command prompt with your project’s executable as a parameter:
installutil .exe 
  • For the 32-bit version of the .NET Framework 4 or 4.5 and later, if your Windows installation directory is C:\Windows, the default path is C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe.
  • For the 64-bit version of the .NET Framework 4 or 4.5 and later, the default path is C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe.

Uninstall using InstallUtil.exe utility

  1. From the Start menu, select the Visual Studio version> directory, then select Developer Command Prompt for VS version>. The Developer Command Prompt for Visual Studio appears.
  2. Run InstallUtil.exe from the command prompt with your project’s output as a parameter:
installutil /u .exe 

Install using PowerShell

  1. From the Start menu, select the Windows PowerShell directory, then select Windows PowerShell.
  2. Access the directory where your project’s compiled executable file is located.
  3. Run the New-Service cmdlet with a service name and your project’s output as arguments:
New-Service -Name "YourServiceName" -BinaryPathName .exe 

Uninstall using PowerShell

  1. From the Start menu, select the Windows PowerShell directory, then select Windows PowerShell.
  2. Run the Remove-Service cmdlet with the name of your service as an argument:
Remove-Service -Name "YourServiceName" 

Note You must have PowerShell 6 or later to use this cmdlet. For information about updating PowerShell, see Installing PowerShell on Windows.

sc.exe delete "YourServiceName" 

See also

  • Introduction to Windows service applications
  • How to: Create Windows services
  • How to: Add installers to your service application
  • Installutil.exe (Installer tool)

Collaborate with us on GitHub

The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, see our contributor guide.

Учебник. Создание приложения службы 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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

    Как создать службу в Windows 10 или 11 средствами системы

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

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

    Сегодня мы предлагаем познакомиться со способами создания служб исключительно средствами операционной системы. Используйте их, если в качестве службы вам нужно установить процесс исполняемого файла EXE , так как для назначения службами процессов скриптов всё же удобнее использовать Non-Sucking Service Manager.

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

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

    Запустите командную строку от имени администратора и выполните в ней команду следующего вида:

    sc create MyService binPath=»C:\service.exe» DisplayName= «ServiceName» type=own start=auto

    Sc create

    Как нетрудно догадаться, C:\service.exe – это путь к исполняемому файлу службы, ServiceName – отображаемое имя (псевдоним) , а MyService – фактическое имя службы, к которому нужно будет обращаться в процессе настройки службы. Параметр type задает статус, в параметр start – тип запуска.

    Службы

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

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

    Если служба станет больше не нужна, вы всегда сможете ее удалить командой:

    sc delete MyService

    Sc delete

    PowerShell

    Средствами создания и управления службами обладает также и консоль PowerShell .

    Запустите ее от имени администратора и выполните следующую команду:

    New-Service -Name MyService -BinaryPathName C:\service.exe -DisplayName «ServiceName» -Description » Service Description»

    New-Service

    Ключевыми параметрами являются -Name и -BinaryPathName: первый принимает произвольное имя устанавливаемой службы, а второй – путь к исполняемому файлу службы.

    Моя служба

    Параметры -DisplayName и -Description являются дополнительными, они задают отображаемое имя и описание службы.

    Свойство моей службы

    А вот с удалением службы в PowerShell не всё так однозначно.

    Если у вас установлена консоль шестой или более новой версии, службу можно будет удалить командой:

    Remove-Service -Name MyService

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

    (Get-WmiObject win32_service -Filter «name=’MyService'»).delete()

    Get-WmiObject

    Для тех, кто не в курсе: узнать текущую версию PowerShell можно командой host , билд будет указан в строке Version.

    Host

    И возвращаясь к службам отметим, что между службами, созданными в командной строке и PowerShell, нет никакой разницы, поэтому для их удаления в том и другом случае вы можете использовать команду sc delete MyService.

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

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

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

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

    Это хороший вопрос, и на него можно ответить утвердительно, однако понятие «автозагрузка» часто употребляется в широком смысле слова без различия, что именно и как именно загружается. Если вы имеете общие представления о работе процессов Linux, то наверняка знакомы с такой сущностью как демон. Это процесс, но процесс несвязанный с каким-либо конкретным пользователем и работающий как-бы автономно. Службы в Windows очень похожи на этих самых демонов, они тоже независимы от пользователей. Когда вы добавляете в автозагрузку программу, пусть даже не имеющую графического интерфейса, она запускается в рабочем окружении пользователя при входе последнего в свою учетную запись, тогда как службы запускаются еще до ввода пользователем логина и пароля и напрямую с ним не взаимодействуют.

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

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

    Сайт NSSM

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

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

    Скрипт

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

    Выполнить с помощью PowerShell

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

    Запрос на разрешение

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

    Транскрибирование запущенно

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

    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», чтобы установить службу.

    Non-Sucking Service Manager

    Non-Sucking Service Manager

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

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

    Автоматически

    То, что скрипт заработал, станет видно из того, что в месте его расположения появится папка «Logs» , при этом вывод самой консоли будет скрыт. И вот что интересно. Запустив службу, мы вышли из учетной записи в 12.46, а затем вошли в нее в 12.50, но служба продолжала работать даже в наше отсутствие в системе! Это еще раз говорит о том, что системная служба не связана с пользовательским окружением.

    Лог службы

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

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

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

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

    Подтверждаем действие

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

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

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