Как создать службу windows через командную строку

Заметки айтишника

Только из собственного опыта

понедельник, 14 января 2013 г.

Управление службами через командную строку (консоль) Windows

Для работы со службами в Windows, существует утилита командной строки sc, также для управления можно использовать утилиту net. В данной стать я не буду пытаться описать все их параметры. Цель статьи — показать как со службами производить основные действия: установка, удаление, запуск, остановка.

Создание (установка, инсталляция) службы:

sc [computername] create [newservice] binpath= [путь к exe-файлу приложения]
где:
[computername] — имя компьютера на котором устанавливается служба (для локального этот параметр можно опустить)
[newservice] — имя вашей службы
[путь к exe-файлу приложения] — полный путь к вашей программе.
— дополнительные параметры. Необязательны. Т.к. в мой пост не ставит целью дать доскональное описание этой утилиты, о параметрах вы можете почитать например здесь.
Обратите внимание на пробел после binpath, он обязательный!
Кстати, если в пути есть пробелы, то его следует заключить в кавычки » «. Если есть русские буквы, то, возможно потребуется решить проблемы с кодировкой (аналогично описаному здесь). В Windows 7, команду надо выполнять от имени администратора. И самое главное: не каждая программа может быть службой! Она должна быть написана соответствующим образом для этого!

sc.exe создать sc.exe create

Создает подраздел и записи для службы в реестре и в базе данных диспетчера управления службами. Creates a subkey and entries for a service in the registry and in the Service Control Manager database.

Синтаксис Syntax

Параметры Parameters

Параметр Parameter Описание Description
Указывает имя удаленного сервера, на котором расположена служба. Specifies the name of the remote server on which the service is located. Имя должно использовать формат UNC (например, \ MyServer). The name must use the Universal Naming Convention (UNC) format (for example, \myserver). Чтобы запустить SC.exe локально, не используйте этот параметр. To run SC.exe locally, don’t use this parameter.
Указывает имя службы, возвращенное операцией жеткэйнаме . Specifies the service name returned by the getkeyname operation.
type= > Указывает тип службы. Specifies the service type. Эти способы могут быть следующими: The options include:
  • собственный — указывает службу, которая выполняется в собственном процессе. own — Specifies a service that runs in its own process. Он не предоставляет доступ к исполняемому файлу другим службам. It doesn’t share an executable file with other services. Это значение по умолчанию. This is the default value.
  • Share — указывает службу, которая выполняется как общий процесс. share — Specifies a service that runs as a shared process. Он использует исполняемый файл совместно с другими службами. It shares an executable file with other services.
  • kernel — указывает драйвер. kernel — Specifies a driver.
  • филесис — указывает драйвер файловой системы. filesys — Specifies a file system driver.
  • REC — указывает драйвер, распознаваемый файловой системой, который определяет файловые системы, используемые на компьютере. rec — Specifies a file system-recognized driver that identifies file systems used on the computer.
  • взаимодействие — указывает службу, которая может взаимодействовать с рабочим столом и получать входные данные от пользователей. interact — Specifies a service that can interact with the desktop, receiving input from users. Интерактивные службы должны запускаться под учетной записью LocalSystem. Interactive services must be run under the LocalSystem account. Этот тип должен использоваться в сочетании с Type = владеть или Type = Shared (например, Type = взаимодействиеType = владеет). This type must be used in conjunction with type= own or type= shared (for example, type= interacttype= own). При использовании типа = взаимодействие само по себе вызывает ошибку. Using type= interact by itself will generate an error.
start= Указывает тип запуска для службы. Specifies the start type for the service. Эти способы могут быть следующими: The options include:
  • Загрузка — указывает драйвер устройства, который загружается загрузчиком. boot — Specifies a device driver that is loaded by the boot loader.
  • система — указывает драйвер устройства, который запускается во время инициализации ядра. system — Specifies a device driver that is started during kernel initialization.
  • автоматически указывает службу, которая автоматически запускается при каждом перезапуске компьютера и выполняется, даже если никто из них не входит в систему. auto — Specifies a service that automatically starts each time the computer is restarted and runs even if no one logs on to the computer.
  • Demand — указывает службу, которая должна быть запущена вручную. demand — Specifies a service that must be started manually. Это значение по умолчанию, если Start = не задано. This is the default value if start= is not specified.
  • Disabled (отключено ) — указывает службу, которая не может быть запущена. disabled — Specifies a service that cannot be started. Чтобы запустить отключенную службу, измените тип запуска на другое значение. To start a disabled service, change the start type to some other value.
  • отложенный — автоматически указывает службу, которая запускается автоматически через некоторое время после запуска других автоматических служб. delayed-auto — Specifies a service that starts automatically a short time after other auto services are started.
error= Указывает серьезность ошибки, если служба не запускается при запуске компьютера. Specifies the severity of the error if the service fails to start when the computer is started. Эти способы могут быть следующими: The options include:
  • Обычная — указывает, что ошибка записывается в журнал и отображается окно сообщения, информирующее пользователя о том, что не удалось запустить службу. normal — Specifies that the error is logged and a message box is displayed, informing the user that a service has failed to start. Запуск будет продолжен. Startup will continue. Это параметр по умолчанию. This is the default setting.
  • серьезная — указывает, что ошибка регистрируется (по возможности). severe — Specifies that the error is logged (if possible). Компьютер пытается перезапуститься с последней удачной конфигурацией. The computer attempts to restart with the last-known good configuration. Это может привести к тому, что компьютер сможет перезапуститься, но служба по-прежнему может не запуститься. This could result in the computer being able to restart, but the service may still be unable to run.
  • критическая — указывает, что ошибка записывается в журнал (если возможно). critical — Specifies that the error is logged (if possible). Компьютер пытается перезапуститься с последней удачной конфигурацией. The computer attempts to restart with the last-known good configuration. Если последняя удачная конфигурация завершается сбоем, запуск также завершается сбоем, а процесс загрузки останавливается с ошибкой остановки. If the last-known good configuration fails, startup also fails, and the boot process halts with a Stop error.
  • Ignore — указывает, что ошибка записывается в журнал, и запуск продолжится. ignore — Specifies that the error is logged and startup continues. Пользователю не выдается уведомление, кроме записи ошибки в журнал событий. No notification is given to the user beyond recording the error in the Event Log.
binpath= Указывает путь к двоичному файлу службы. Specifies a path to the service binary file. Значение по умолчанию для BinPath =, и эта строка должна быть указана. There is no default for binpath=, and this string must be supplied.
group= Указывает имя группы, членом которой является эта служба. Specifies the name of the group of which this service is a member. Список групп хранится в реестре в подразделе хклм\систем\куррентконтролсет\контрол\сервицеграупордер . The list of groups is stored in the registry, in the HKLM\System\CurrentControlSet\Control\ServiceGroupOrder subkey. По умолчанию используется значение NULL. The default value is null.
tag= Указывает, следует ли получить TagID из вызова CreateService. Specifies whether or not to obtain a TagID from the CreateService call. Теги используются только для драйверов загрузки и запуска системы. Tags are used only for boot-start and system-start drivers.
depend= Указывает имена служб или групп, которые должны быть запущены перед этой службой. Specifies the names of services or groups that must start before this service. Имена разделяются косой чертой (/). The names are separated by forward slashes (/).
obj= <| > Указывает имя учетной записи, в которой будет выполняться служба, или задает имя объекта драйвера Windows, в котором будет выполняться драйвер. Specifies a name of an account in which a service will run, or specifies a name of the Windows driver object in which the driver will run. Значение по умолчанию — LocalSystem. The default setting is LocalSystem.
displayname= Указывает понятное имя для идентификации службы в программах пользовательского интерфейса. Specifies a friendly name for identifying the service in user interface programs. Например, имя подраздела одной конкретной службы — wuauserv, которое имеет более понятное отображаемое имя автоматическое обновление. For example, the subkey name of one particular service is wuauserv, which has a more friendly display name of Automatic Updates.
password=

Указывает пароль. Specifies a password. Это необходимо, если используется учетная запись, отличная от учетной записи LocalSystem. This is required if an account other than the LocalSystem account is used. /? /? Отображение справки в командной строке. Displays help at the command prompt.

Комментарии Remarks

Каждый параметр командной строки (параметр) должен включать знак равенства как часть имени параметра. Each command-line option (parameter) must include the equal sign as part of the option name.

Между параметром и его значением требуется пробел (например, Type = an). A space is required between an option and its value (for example, type= own. Если пространство не указано, операция завершается ошибкой. If the space is omitted, the operation fails.

Примеры Examples

Чтобы создать и зарегистрировать новый двоичный путь для службы невсервице , введите: To create and register a new binary path for the NewService service, type:

Windows: Запуск Службы — CMD & PowerShell

Служба в Windows может быть запущена с помощью утилиты Service Manager.

Для запуска Service Manager GUI, нажмите клавишу Win для открытия меню «Пуск», наберите services , чтобы найти Service Manager и нажмите Enter .

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

В данной заметке я показываю, как запустить, остановить или узнать состояние службы в Windows с помощью командной строки (CMD) или PowerShell.

Дельный Совет: Вывести список служб в Windows из CMD! Читать далее →

Запуск Службы Из Командной Строки (CMD)

Во избежании ошибки «Access is denied«, запустите CMD с правами администратора: нажмите клавишу Win , чтобы открыть меню «Пуск», наберите cmd , чтобы найти командную строку и нажмите комбинацию Ctrl + Shift + Enter , чтобы запустить командную строку от имени администратора.

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

Узнать состояние службы:

Дельный Совет: Убить зависший процесс в Windows из CMD! Читать далее →

Запуск Службы Из PowerShell

Во избежании ошибки «Access is denied«, запустите PowerShell с правами администратора: нажмите клавишу Win , чтобы открыть меню «Пуск», наберите powershell , чтобы найти командную строку и нажмите комбинацию Ctrl + Shift + Enter , чтобы запустить PowerShell от имени администратора.

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

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

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


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

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

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

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


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

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


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

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

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

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

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

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

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


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

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


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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

Читайте также:  Отключить диспетчер серверов windows 2016 при загрузке
Оцените статью