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

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

Создание службы с помощью программы Sc.exe

Первый способ позволяет создавать службы, используя утилиты, работающие через командную строку. В данном случае, используется инструмент sc.exe. Он позволяет взаимодействовать с функциями API и выполнять операции со службами Windows 10. Несмотря на то, что данная программа даже не обладает графическим интерфейсом, она является мощным инструментом и может контролировать состояние служб, создавать, редактировать и управлять ими. Если создавать службу, с помощью sc.exe, то не возникает необходимости в изменении параметров реестра и списка служб в диспетчере. Кроме того, утилита способна работать со службами на локальном компьютере, и выполнять те же действия на удаленных машинах. Чтобы создать новый сервис, откройте командную строку от имени администратора и запустите команду «Sc create». Она запишет новую службу к базе диспетчера служб. Синтаксис команды представлен следующим образом:

sc create [ServiceName] [binPath= ] <параметр1= ><параметр2= >

Где:

  • BinPath — в этом параметре записываем путь, где хранится исполняемый файл.

Чтобы было понятнее, в качестве примера, мы создадим службу «MySevice». При этом, отображаемое имя будет «My New Service». Указываем тип службы и включаем автозапуск:

Sc create MyService binPath=C:MyServiceMyService.exe DisplayName=″My New Service″ type=own start=auto

Теперь откройте оснастку «Services» и взгляните на то, что получилось:

sozdanie-sluzhby-v-windows-10-1.jpg

Параметры службы, которая уже была создана и запущена, можно изменить при помощи команды Sc config. К примеру, мы заменим имя службы, которое отображается как:

Sc config MyService DisplayName=″My Service″

А еще можно избавиться от службы полным ее удалением. Для этого используйте такую команду:

Sc delete MyService

sozdanie-sluzhby-v-windows-10-2.jpg

С помощью утилиты PowerShell

Ну а с помощью такого мощного инструмента, как PowerShell можно хоть горы двигать. Он обладает большими возможностями и способен работать с различными службами. Здесь, для добавления новой службы, существует специальная команда «New -Service». Давайте попробуем новую службу, как и в прошлом примере, будем использовать те же имена и значения, только добавим дополнительный параметр, в виде описания. И так, команда, для создания нового сервиса, выглядит следующим образом:

New-Service -Name MyService -BinaryPathName C:MyServiceMyService.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. Но есть один маленький минус — здесь нет простой команды для удаления службы. Поэтому приходиться использовать такой вот, немного мудреный, код:

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

Так что утилита sc.exe, в этом плане будет получше. И по этой причине я предпочитаю именно ее.

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

Этот уже немолодой механизм состоит из двух компонентов: утилиты 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:temprktoolssrvany.exe 

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

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

C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:tempPolarisserver.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:tempPolarisserver.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 и ряда других аналогов. Из минусов бросается в глаза недостаточный контроль над всем процессом.

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

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

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

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

#NoTrayIcon #RequireAdmin #Region #AutoIt3Wrapper_Version=Beta #AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_Compile_Both=y #AutoIt3Wrapper_UseX64=y #EndRegion  Dim $MainLog = @ScriptDir & "test_service.log"  #include  #include <windowscoename if=""> 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:WindowsSystem32WindowsPowerShellv1.0powershell.exe -ExecutionPolicy Bypass -NoProfile -File C:tempPolarisserver.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 AUTHORITYNetworkService")     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</windowscoename>

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

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

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

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

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

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

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

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

Средство выполнения команд позволяет открывать программы, папки, документы или ресурсы Интернета введя нужное имя. Окно управления службами можно открыть выполнив команду services.msc в окне Win+R. Смотрите также другие команды Выполнить в Windows 10.

Окно управления службами также с легкостью можно найти используя обновленный поиск Windows 10. Пользователю достаточно открыть поиск нажав комбинацию клавиш Win+Q, и в поисковой строке ввести Службы. А уже в результатах поиска выбрать классическое приложение Службы.

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

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

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

  1. Откройте контекстное меню нажав правой кнопкой мыши на панели задач и выберите пункт Диспетчер задач или же воспользуйтесь сочетанием клавиш Ctrl+Shift+Esc.
  2. В открывшемся окне достаточно перейти в последнюю вкладку Службы чтобы получить возможность управления службами.

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

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

  1. Выполните команду msconfig в окне Win+R или найдите Конфигурацию системы в поиске Windows 10.
  2. Дальше перейдите во вкладку Службы для управления службами.

Хорошей особенностью этого способа есть возможность отделить сторонние службы от служб Майкрософт отметив пункт Не отображать службы Майкрософт. А также обратите внимание что некоторые службы безопасности Майкрософт не могут быть отключены.

Заключение

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

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

В данной статье рассмотрены несколько способов, с помощью которых можно открыть приложение «Службы» в операционной системе Windows 10.

Служба (service) – это процесс, который запускается на устройстве в фоновом режиме для выполнения определенных действий в ответ на запросы пользователей, приложений или системы.

Состав имеющихся в наличии и запущенных служб зависит от версии операционной системы и установленных в ней приложений.

Основным инструментом для управления службами в графическом режиме на локальном компьютере является приложение (консоль) «Службы», которое находится в программной группе «Средства администрирования Windows»

Далее в статье показаны различные способы доступа к приложению «Службы».

Содержание

Как открыть Службы используя окно «Выполнить»

Данный способ применим ко всем версиям операционной системы Windows.

Чтобы открыть Службы, нажмите сочетание клавиш + R, в открывшемся окне Выполнить введите services.msc и нажмите клавишу Enter ↵.

Как открыть Службы используя «Поиск в Windows»

Чтобы открыть Службы, используйте «Поиск в Windows», для этого нажмите на значок поиска в панели задач или нажмите сочетание клавиш + S, в строке поиска начните вводить службы и в результатах поиска выберите Службы Классическое приложение.

Также в строке поиска начните вводить services и в результатах поиска выберите Службы Классическое приложение.

Как открыть Службы в меню «Пуск»

Откройте меню «Пуск», в списке приложений в группе под буквой «С», найдите и разверните папку Средства администрирования Windows и выберите приложение Службы.

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

Как открыть Службы используя утилиту «Управление компьютером»

Службы также присутствует в системе и как элемент утилиты «Управление компьютером».

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

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

Службы откроются в этом же окне.

Как открыть Службы используя «Диспетчер задач»

Откройте диспетчер задач, для этого нажмите сочетание клавиш Ctrl + Shift + Esc, затем выберите вкладку Службы и нажмите на ссылку Открыть службы.

Как открыть Службы используя «Панель управления»

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

Затем в открывшейся папке Администрирование выберите Службы.

Как открыть Службы в системном каталоге «System32»

Откройте Проводник Windows и перейдите по следующему пути:

C:\Windows\System32

Чтобы открыть Службы, дважды кликните по файлу services.msc

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

Также открыть Службы можно в командной строке или в консоли Windows PowerShell, для этого запустите командную строку или консоль PowerShell и выполните команду services.msc

Теперь, используя любой из представленных выше способов, можно открыть приложение (консоль) Службы в операционной системе Windows 10.

WindowsНоя032015

slygbu-windows.png Неведомыми мне путями возникла проблема запуска одной из служб, когда она не хотели ни создаваться, ни удаляться. Инсталлятор программного обеспечения просто отказывался что либо делать с некорректно работающей службой. Пришлось немного покопать в «глубь», чтобы решить эту проблему. Существует несколько вариантов установки/удаления служб это через утилиту SC.exe, или с помощью Power Shell. И тот и другой инструмент присутствует по умолчанию в поставке Windows.

И так, как произвести установку службы с помощью SC.exe: 1.Обязательно запускаем командную строку от имени Администратора. 2. Копируем текст, и заменяем параметры на необходимые нам.

Sc create MyService binPath= C:MyServiceMyService.exe DisplayName= “My New Service” type= own start= auto

где,SC create — параметр указывающий, что мы хотим создать службу;MyService — Имя службы;binPath — путь до службы (если присутствуют пробелы в пути, то необходимо использовать двойные кавычки);DisplayName — Как будет отображаться название службы в диспетчере;type — тип службы;start — тип запуска службы.ВАЖНО! следите за пробелами в командах, после параметра пробел не нужен, но после знака равно обязателен, в противном случае будет ошибка (пример: type= own)

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

Sc delete MyService

При необходимости, можно изменить ошибочные параметры (но мне проще удалить службу и создать ее заново, кому как).

Sc config MyService DisplayName=”My Service one”

Как произвести установку службы с помощью Power Shell.

New-Service -Name MyService -BinaryPathName C:MyServiceMyService.exe -DisplayName “My New Service” -Description “New MyService”

Отличие от SC.exe только в одном, в этой команде можно добавить описание службы (для кого то это важно).

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

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

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

Set-Service -Name MyService -Description ″Not Very Important Service″ -StartupType ManualИспользуемые источники:

  • https://prostocomp.net/sistema/sozdanie-sluzhby-v-windows.html
  • https://habr.com/post/421019/
  • https://windd.ru/kak-otkryt-sluzhby-v-windows-10/
  • https://winnote.ru/main/526-kak-otkryt-sluzhby-v-windows-10.html
  • http://www.r2d2.pro/sozdanie-i-udalenie-sluzhby-windows/

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий