Службы в Windows используются для запуска исполняемых файлов приложений в фоновом режиме, как правило не предусматривающем взаимодействия с пользователем. Службы могут автоматически запускаться при загрузке Windows и работать в фоне все время до отключения системы. В этой статье мы рассмотрим, как создать новую системную службу из исполняемого файла.
В Windows есть несколько встроенных инструментов, позволяющих создать (установить) новую службу из командной строки: утилита sc.exe и PowerShell командлет New-Service.
Следующая команда создаст службу из указанного исполняемого файла с дополнительными опциями запуска:
sc create CorpCollectorService binPath= "C:\tools\collector.exe -i C:\tools\config.xml" start= auto DisplayName= "CORP Log Collector Service"
В случае успешного выполнения команды, появится сообщение:
[SC] CreateService SUCCESS
Используются следующие параметры:
-
CorpCollectorService
– имя службы -
binPath
– содержит полный путь к исполняемому файлу и необходимые аргументы запуска (в кавычках, если содержит пробелы). -
start= auto
– автоматически запускать службу при загрузке компьютера (boot|system|auto|demand|disabled). -
DisplayName
— описательное имя службы
Можно использовать дополнительные параметры:
-
type
— тип службы. По умолчанию используется own (служба работает в собственно процессе). Можно указать own|share|kernel|filesys|adapt|rec|interact - По умолчанию служба запускается от имени Local System. Если нужно запустить службу от имени определенного пользователя, нужно указать его имя и пароль с помощью параметров
obj= "corp\username" password= "UserPass1"
Теперь вы можете открыть графическую оснастку управления службами
services.msc
. Новая служба появится в списке сервисов (нажмите F5, чтобы перечитать базу данных диспетчера служб), и вы можете запустить службу или изменить тип запуска.
Все настройки службы хранятся в ветке реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
. Для новой службы был автоматически создан раздел CorpCollectorService.
Аналогичная команда PowerShell для создания службы:
New-Service -Name CorpCollectorService -BinaryPathName "C:\tools\collector.exe -i C:\tools\config.xml" -DisplayName "my test service" -Description "CORP Log Collector Service" -StartupType "Automatic"
Если нужно задать имя пользователя и пароль для запуска службы, используйте такой синтаксис:
$username = "admin1"
$password = "password1"
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($username, $securepassword)
New-Service … -Credential $cred
sc delete имя_службы
Нужно отметить, что произвольный исполняемый файл вряд-ли получится запустить в качестве службы Windows. Дело в том, что такое приложение должно быть специально разработано для работы в качестве сервиса и уметь взаимодействовать с управляющими командами Service Control Manager (SCM).
Если приложение не умеет обрабатывать управляющие сигналы SCM, при попытке запустить такую службы появится ошибка 1053:
Windows could not start the MyService1 service on Local Computer. Error 1053: The service did not respond to the start or control request in a timely fashion.
Для запуска произвольного приложения (которое изначально не предназначено для работы в качестве службы, в том числе приложений с графическим интерфейсом) в виде сервиса Windows можно использовать дополнительные сторонние утилиты. В Windows Server Resource 2003 были доступны утилиты
srvany.exe
и
instsrv.exe
, которые можно использовать для создания службы из произвольного файла. Однако предпочтительнее использовать более современную утилиту NSSM (Non-Sucking Service Manager), которая в отличии от старых классических утилит Microsoft умеет контролировать состояние запущенного процесса приложения и работать как верхнеуровневый обработчик над процессами.
Установить NSSM можно с помощью пакетного менеджера winget:
winget install --id NSSM.NSSM -e
Теперь, чтобы создать службу из произвольного исполняемого файла:
nssm install testservice "C:\Tools\collector.exe"
Обратите внимание, что в свойствах новой службы в качестве оболочки для запуска вашего исполняемого файла используется
nssm.exe
.
У NSSM есть простенький графический интерфейс для настройки параметров службы. Например, чтобы отредактировать созданную ранее службу, выполните:
nssm edit testservice