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

Службы в Windows — особые процессы, выполняемые в фоновом режиме, в том числе от учетной записи «СИСТЕМА», которые могут быть запущены в том числе до входа в систему. При желании вы можете создать свою собственную службу, которая будет работать таким же образом.

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

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

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

  1. Запустите командную строку от имени Администратора (способы запуска командной строки от Администратора).
  2. Используйте команду, заменив текстовые описания и пути на свои:
    sc create Имя_службы binPath="C:\service-file.exe" DisplayName= "Описание_службы" type=own start=auto
  3. После нажатия Enter вы получите сообщение: CreateService: успех, что означает, что служба была успешно создана.
    Создание службы в командной строке Windows

В указанной команде используются следующие параметры:

  • binPath — путь к исполняемому файлу службы.
  • DisplayName — отображаемое в списке служб имя службы.
  • start — тип запуска, возможные значения: boot, auto, demand (значение по умолчанию), disabled, delayed-auto
  • type — тип службы, по умолчанию own, возможны другие значения: share (делит исполняемый файл с другими службами), kernel (драйвер), filesys (драйвер файловой системы), interact (интерактивная служба с возможность взаимодействия с пользователем, поддержка этого типа служб прекращается).

После создания службы вы сможете увидеть её в списке служб (Win+Rservices.msc), а автоматический запуск произойдет при следующей перезагрузке системы.

Созданная служба в списке служб Windows

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

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

New-Service -Name "Имя_Службы" -BinaryPathName '"C:\путь_к_файлу параметры_запуска"'

Расширенный вариант с указанием описания и типа запуска:

New-Service -Name MyService -BinaryPathName '"C:\путь_к_файлу параметры_запуска"' -DisplayName "Имя_службы" -Description "Описание службы" -StartupType "Automatic"
Создание службы в Windows PowerShell

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

-BinaryPathName C:\remontka.exe

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

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

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

sc delete Имя_службы
Удаление службы в командной строке

Или в Windows PowerShell:

Remove-Service -Name MyService

После выполнения указанных команд созданная вами служба будет удалена из Windows.

Созданная служба не работает, варианты решения

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

Причина в том, что исполняемые файлы служб — не совсем обычные программы, они, помимо прочего, обмениваются данными с системой. Если ваш EXE не отвечает на соответствующие запросы системы, Windows «делает вывод» о том, что со службой что-то не так.

Как быть, если вы всё-таки настойчиво хотите использовать свой прикладной исполняемый файл в качестве службы?

  • Использовать планировщик заданий и запуск от соответствующего пользователя — это не будет в полной мере службой, но почти то, что нужно.
  • Ранее существовала программа RunAsSvc, позволяющая запускать любые процессы в качестве службы, но для современных ОC он не применима, а разработка была прекращена.
    Утилита RunAsSvc

  • Использовать инструменты INSTSRV.EXE и SRVANY.EXE из Windows Server 2003 Resource Kit Tools при создании службы Windows.

Создание пользовательской службы с помощью INSTSRV.EXE и SRVANY.EXE

Последний вариант из приведённого выше списка рассмотрим подробнее. Шаги будут следующими:

  1. Загрузите (вероятнее всего, придется найти в Интернете на сторонних сайтах) Windows Server 2003 Resource Kit полностью или только файлы INSTSRV.EXE и SRVANY.EXE, располагаем их у себя на диске, в моем примере путь — C:\Windows
  2. В командной строке от имени администратора используйте команду (пути меняем на свои):
    C:\Windows\instsrv.exe Имя_службы C:\Windows\srvany.exe
    Создание службы с помощью instsrv и srvany

  3. Если вы получили сообщение о том, что The service was successfully added, всё прошло успешно. Теперь требуется запустить редактор реестра (Win+Rregedit).
  4. В редакторе реестра перейдите по пути
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\

    и найдите раздел с вашим именем службы. Нажимаем по нему правой кнопкой мыши и выбираем пункт «Создать» — «Раздел», задаем имя «Parameters» для раздела.

  5. Выберите созданный раздел, нажмите правой кнопкой мыши в правой панели редактора реестра и создайте новый строковый параметр с именем Application
  6. Дважды нажмите по параметру и в поле «Значение» укажите путь к вашему файлу exe для запуска службы.
    Путь к исполняемому файлу службы в реестре

Закройте редактор реестра — служба создана, её можно запустить из services.msc или она будет автоматически запущена после перезагрузки компьютера.

Учитывайте, что во всех приведенных примерах служба по умолчанию запускается с учетной записью «СИСТЕМА». В некоторых случаях это может приводить к неправильной работе. В этом случае может иметь смысл зайти в свойства службы в services.msc и изменить параметры на вкладке «Вход в систему».

Все способы:

  • Способ 1: Консольная утилита sc.exe
  • Способ 2: Консоль «PowerShell»
  • Способ 3: Сторонние программы
  • Вопросы и ответы: 0

Способ 1: Консольная утилита sc.exe

Назначить любой процесс системной службой в Windows 10 можно с помощью маленькой консольной утилиты sc.exe, входящей в состав операционной системы. Для обращения к ней можно использовать как классическую «Командную строку», так и консоль «PowerShell».

  1. Запустите от имени администратора «Командную строку» или «PowerShell». Первую можно открыть из поиска Windows, вторую – из контекстного меню кнопки «Пуск».
  2. Как создать службу в Windows 10-1

  3. Сформируйте команду следующего вида: sc create MyService binPath="C:\MyService.exe" DisplayName= "MyNewService" type=own start=auto. В качестве параметра MyService binPath укажите свой путь к исполняемому файлу создаваемой службы, а в качестве параметра DisplayName — имя службы, которое станет отображаться в оснастке управления службами.
  4. Вставьте сформированную команду в консоль и нажмите клавишу ввода.
  5. Как создать службу в Windows 10-2

Готово, осталось только проверить корректность создания службы в системной оснастке «Службы», запустить которую можно командой services.msc в диалоговом окошке, вызванном клавишами Win + R.

Как создать службу в Windows 10-3

Способ 2: Консоль «PowerShell»

Необходимыми средствами создания служб в Windows 10 располагает другой штатный инструмент – консоль «PowerShell».

  1. Запустите «PowerShell» от имени администратора.
  2. Как создать службу в Windows 10-4

  3. Сформируйте команду вида New-Service -Name MyService -BinaryPathName C:\MyService.exe -DisplayName "Отображаемое имя службы" -Description "Описание службы". Имя и описание службы могут быть произвольными.
  4. Вставьте команду в консоль и нажмите клавишу ввода.
  5. Как создать службу в Windows 10-5

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

Способ 3: Сторонние программы

Также для создания собственных служб в Windows 10 можно использовать специализированные сторонние утилиты, например Non-Sucking Service Manager. Утилита работает через «Командную строку», но у нее также имеется и графический интерфейс.

Скачать Non-Sucking Service Manager с официального сайта

  1. Скачайте архив с утилитой с сайта разработчика и распакуйте в удобное расположение — к примеру, поместите исполняемый файл nssm.exe в корень системного диска.
  2. Запустите «Командную строку» от имени администратора.
  3. Выполните команду C:\nssm.exe install MyService, где MyService – название создаваемой службы.
  4. Как создать службу в Windows 10-6

  5. В открывшемся окошке инсталлятора в поле «Patch» укажите полный путь к исполняемому файлу службы и нажмите кнопку «Install service».
  6. Как создать службу в Windows 10-7

  7. Служба будет установлена, подтверждением чему станет появление окошка с уведомлением «Service *Name* installed successfully!». Нажмите в нем «OK» и закройте «Командную строку».

Остальные поля в окошке инсталлятора службы заполнять не обязательно, кроме тех случаев, когда в качестве службы устанавливается командный файл, например CMD, BAT или PS1. В этом случае в поле «Patch» указывается путь к приложению-обработчику, а в поле «Arguments» – путь к файлу скрипта.

Наша группа в TelegramПолезные советы и помощь

We already discussed how to delete a service in Windows 10, 8, and 7, so now we will discuss how to add a Service which is handy if you want to add or restore a Service.

Adding a service is easy using the Command Prompt or PowerShell as an administrator.

Type in sc.exe create SERVICENAME binpath= «PATH TO SERVICE»

Notes:
Replace SERVICENAME without spaces in the name
Be sure to leave a space after binpath=

For example, I can create a PowerShell shortcut by using:
sc.exe create PowerShell binpath= «C:\Windows\System32\Windows\PowerShellv1.0powershell.exe»

Open Services (Windows key + R and services.msc) and edit your new service however you like.

You can also delete any service.

Similar:

  • How to Restore or Verify Default Services in Windows 7, 8, and 10
  • How to Identify Processes or Services on Your Computer
  • How to Add Services to Control Panel in Windows
  • How-To Customize Process Information Viewed in Task Manager
  • Automatic and Manual Trigger Start Explained

    comments powered by Disqus

  • Время на прочтение6 мин

    Количество просмотров85K

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

    Статья будет полезна тем, кто, как и я — «программист не настоящий».

    Зачем нужна служба, если есть назначенные задания

    В отличие от назначенных заданий служба работает постоянно, запускается при старте ПК и может управляться средствами Windows. А еще регулярно запускаемому скрипту могут понадобиться данные с предыдущего запуска, и может быть полезно получение данных из внешних источников — например, в случае TCP или Web сервера.

    Лично мне за последние пять лет приходилось создавать службу три с половиной раза:

    • Потребовалось создать сервис на fail2ban для Windows 2003., который работал с логами FileZilla и Apache, а при подозрении на брутфорс блокировал IP штатными средствами Windows — ipsec.
    • Аналог телнет-сервера для домашних версий Windows. Понадобилось выполнять команды на удаленных рабочих станциях, которые были под управлением Windows 7 Home. По сути, вторая попытка поиграть в службы.
    • Музыкальный проигрыватель для торгового зала под Windows. Задачу по ТЗ можно было решить при помощи mpd и пачки скриптов, но я решил — если уж делать скрипты, то почему бы и не «сваять» проигрыватель самому. За основу взял библиотеку BASS.dll.
    • Когда выбирали веб-сервер с поддержкой загрузки файлов под Windows, одним из вариантов был HFS. Сам по себе работать он не может, поэтому пришлось «запихивать» его в службу. В результате решение не понравилось, и просто установили «тему» Apaxy на web-сервере Apache.

    Для создания службы можно использовать взрослые языки программирования вроде C. Но если вы не хотите связываться с Visual Studio, то возьмите готовые утилиты. Существуют платные решения вроде FireDaemon Pro или AlwaysUp, но мы традиционно сосредоточимся на бесплатных.

    Способ первый. От Microsoft

    Этот уже немолодой механизм состоит из двух компонентов: утилиты instsrv.exe для установки сервиса и srvany.exe — процесса для запуска любых исполняемых файлов. Предположим, что мы создали веб-сервер на PowerShell при помощи модуля Polaris. Скрипт будет предельно прост:

    New-PolarisGetRoute -Path '/helloworld' -Scriptblock {
        $Response.Send('Hello World!')
    }
    
    Start-Polaris -Port 8080
    
    while($true) {
        Start-Sleep -Milliseconds 10
    }

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

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

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

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

    Теперь пропишем путь к нашему скрипту при помощи магии реестра. Параметры службы есть в разделе реестра HKLM\SYSTEM\CurrentControlSet\Services\WebServ. В нем нам нужно добавить новый раздел Parameters и создать там строковый параметр Application, указав в нем путь к исполняемому файлу. В случае скрипта PowerShell он будет выглядеть так:

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:\temp\Polaris\server.ps1
    

    Настроенная служба.

    Можно запустить и радоваться.

    Работающая служба.

    Однако у этого способа есть недостатки:

    • Утилиты старые, разработаны до изобретения PowerShell, UAC и прочих вещей.
    • Srvany не контролирует работу приложения. Даже если оно выпадет в ошибку, служба продолжит свое дело как ни в чем не бывало.
    • Придется донастраивать и копаться в реестре. Вы же помните, что копаться в реестре небезопасно?

    Поэтому перейдем к методу, частично лишенному этих проблем.

    Способ второй, почти взрослый

    Существует утилита под названием NSSM — Non-Sucking Service Manager, что можно перевести как не-плохой менеджер служб. В отличие от предыдущей, она поддерживается разработчиком, и исходный код опубликован на сайте. Помимо обычного способа, доступна и установка через пакетный менеджер Chocolately.

    Создать сервис можно из обычной командной строки, вооружившись документацией на сайте разработчика. Но мы воспользуемся PowerShell. Потому что можем, разумеется.

    $nssm = (Get-Command ./nssm).Source
    $serviceName = 'WebServ'
    $powershell = (Get-Command powershell).Source
    $scriptPath = 'C:\temp\Polaris\server.ps1'
    $arguments = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $scriptPath
    & $nssm install $serviceName $powershell $arguments
    & $nssm status $serviceName
    Start-Service $serviceName
    Get-Service $serviceName

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

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

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

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

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

    nssm.exe install ServiceName

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Службами в 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.

    Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии
  • C programdata windows task service
  • Реестр windows компоненты windows
  • Windows 10 build 20185
  • Блокируется установка windows 10
  • Защита в реальном времени windows 10 как отключить этим параметром управляет ваш администратор