Как сделать службу c

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

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

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

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

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

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

Если У вас установлен только Core без GUI, или вы любитель скриптов, то это Ваш метод 🙂
1.Обязательно запускаем Power Shell от имени Администратора.
2. Копируем текст, и заменяем параметры на необходимые нам.

New-Service -Name MyService -BinaryPathName C:\MyService\MyService.exe -DisplayName "My New Service" -Description "New MyService"

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

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

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

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

  • ServiceName — данным параметром определяется имя раздела службы в реестре;
    Данное имя не совпадает с тем именем, которое будет отображаться диспетчере (например, в Services).
  • BinPath — в этом параметре записываем путь, где хранится исполняемый файл.

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

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

Sc config MyService DisplayName=″My Service″

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

удалить службу

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

New-Service -Name MyService -BinaryPathName C:\MyService\MyService.exe` -DisplayName ″My New Service″ -Description ″Very Important Service . ″

Set-Service -Name MyService -Description ″Not Very Important Service″ -StartupType Manual

параметры службы windows 10

Если не считать дополнительную возможность добавления описаний к службам, PowerShell обладает таким же функционалом, как и утилита Sc.exe. Но есть один маленький минус — здесь нет простой команды для удаления службы. Поэтому приходиться использовать такой вот, немного мудреный, код:

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

как можно передать аргументы в коллекцию Context.Parameters класса установщика?

Я читал sc.exe документацию, что такие аргументы можно было передать только в конце binPath , но я не нашел примера и не смог успешно это сделать.

Взглянув на ключ Services в реестре, можно предположить, что все необходимые параметры включены в значение ImagePath, поэтому ваша binPath= "c:\abc\def.exe /Param1=ghi" идея кажется правильной. Нужно ли экранировать обратную косую черту (например, "c: \\ abc \\ . ")? Хуже всего то, что вы могли напрямую редактировать значение реестра после этого, если SC.EXE не может этого сделать.

Я отказался от sc.exe и использую installutil.exe следующим образом: Installutil.exe / ServiceName = ”TheName” / targetdir = ”C: \ TheInstallDirectory \” / PackageRoot = ”PackageRootPath”

Я использовал Installutil.exe, а для более старых технологий я использую Instsrv.exe из Windows XP / 2003 Resource Ket.

Уловка состоит в том, чтобы оставить пробел после = в вашем операторе создания, а также использовать "" для всего, что содержит специальные символы или пробелы.

Рекомендуется указать отображаемое имя для службы, а также установить для параметра запуска значение авто, чтобы он запускался автоматически. Вы можете сделать это, указав DisplayName= yourdisplayname и start= auto в своем операторе создания.

Если это сработало, вы должны увидеть:

ОБНОВЛЕНИЕ 1

start= auto является важным, поэтому после перезагрузки служба запустится автоматически. Очень хорошо, если конечный пользователь не является экспертом

Также, если вам нужно передать дополнительные параметры в те, binPath которые требуют кавычек, они должны быть экранированы ( \" ) пример: если бы путь был, c:\some long path\some.exe "first argument" он должен был бы быть binPath= "\"c:\some long path\some.exe\" \"first argument\""

Параметры для созданных сервисов имеют некоторые специфические проблемы с форматированием, в частности, если команда включает пробелы или кавычки:

Если вы хотите ввести параметры командной строки для службы, вы должны заключить всю командную строку в кавычки. (И всегда оставляйте пробел после binPath= и перед первой цитатой, как указала миссис Уэдж)

Итак, чтобы создать службу для команды, PATH\COMMAND.EXE --param1=xyz вы должны использовать следующий параметр binPath:

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

Итак, для команды, которая имеет оба параметра и путь с пробелами, вам нужны вложенные кавычки . Вы должны избегать внутренних кавычек с помощью обратной косой черты \" . То же самое верно, если сами параметры содержат кавычки, вам также нужно будет избегать их.

Несмотря на использование обратной косой черты в качестве escape-символов, вам не нужно избегать обычных обратных косых черт, содержащихся в пути. Это противоречит тому, как вы обычно используете обратную косую черту в качестве escape-символов.

Итак, для такой команды
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2 :

Вот конкретный пример из документации SVNserve, в котором показаны все особые случаи:

(разрывы строк добавлены для удобства чтения, не включайте их)

Я хочу создать сервис из моего скомпилированного кода C / C ++ с Microsoft Visual Studio 2015 , Я скомпилировал свой код и создал сервис с sc.exe из исполняемого файла приложения. Мой код состоит из бесконечного цикла, который записывает простую строку в статический файл за промежутки времени. После создания службы и перезагрузки кажется, что служба останавливается автоматически. Исполняемый файл отлично работает при прямом запуске.

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

и выход out.txt файл:

Решение

Службы Windows — это не просто исполняемые файлы, такие как написанные вами, но они должны следовать определенному шаблону взаимодействия с операционной системой. Вы можете найти всю необходимую информацию на Microsoft сайт, кроме того, любой хороший поисковик покажет бесчисленные примеры того, как написать один (например, Вот ).

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

Другие решения

С помощью @Aconcagua и эта ссылка Я нашел простой код, чтобы просто сделать мой код совместимым с Windows Service. В функции ServiceWorkerThread Вы должны просто поместить свой цикл в блок while. Сервис может быть безопасно остановлен.

Читайте также: