При создании сервиса с sc.exe как передать параметры контекста? - PullRequest
134 голосов
/ 08 сентября 2010

При создании службы Windows с помощью:

sc create ServiceName binPath= "the path"

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

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

Ответы [ 12 ]

233 голосов
/ 06 мая 2012
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

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

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

Вот пример:

C:\Documents and Settings\Administrator> sc create asperacentral 
binPath= "C:\Program Files\Aspera\Enterprise Server\bin\Debug\asperacentral.exe" 
DisplayName= "Aspera Central" 
start= auto

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

[SC] CreateService SUCCESS

ОБНОВЛЕНИЕ 1

http://support.microsoft.com/kb/251192

132 голосов
/ 18 июня 2012

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

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

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

binPath= "PATH\COMMAND.EXE --param1=xyz"
        ^^                             ^
        ||                             |
  space    quote                     quote

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

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

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

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

binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"a b c\" --param2"
         ^ ^                 ^           ^                      ^       ^         ^
         | |                 |           |                      |       |         | 
 opening     escaped      regular     escaped                    escaped       closing
   quote     quote       backslash    closing                    quotes          quote
     for     for            in         quote                      for              for
   whole     path          path       for path                  parameter        whole
 command                                                                       command

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

sc create svnserve 
   binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\"  "
   displayname= "Subversion Server" depend= Tcpip start= auto 

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

Это добавит новый сервис с командной строкой "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories".

Итак, в итоге

  • пробел после каждого параметра sc: binpath=_, displayname=_ и depend=_
  • каждый параметр sc, содержащий пробелы, должен быть заключен в кавычки
  • все дополнительные кавычки внутри binpath экранируются с помощью обратной косой черты: \ "
  • все обратные слеши внутри binpath не экранированы
11 голосов
/ 25 февраля 2015
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

См. Здесь: Изменение «пути к исполняемому файлу» службы Windows

5 голосов
/ 29 января 2011

У меня были проблемы с тем, чтобы это работало в Windows 7. Похоже, я проигнорировал первый аргумент, который я передал, поэтому я использовал binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2", и он работал.

4 голосов
/ 25 июля 2012

Я использую, чтобы просто создать его без параметров, а затем отредактировать реестр HKLM\System\CurrentControlSet\Services\[YourService].

2 голосов
/ 27 февраля 2017

Также важно учитывать, как вы получаете доступ к Аргументам в коде приложения.

В своем приложении на c # я использовал класс ServiceBase:

 class MyService : ServiceBase
{

    protected override void OnStart(string[] args)
    {
       }
 }

Я зарегистрировал свой сервис, используя

sc create myService binpath = "MeyService.exe arg1 arg2"

Но я не мог получить доступ к аргументам через переменную args, когда запускал его как службу.

В документации MSDN предлагается не использовать метод Main для получения аргументов binPath или ImagePath. Вместо этого он предлагает поместить вашу логику в метод OnStart и затем использовать (C #) Environment.GetCommandLineArgs();.

Чтобы получить доступ к первым аргументам arg1 Мне нужно сделать так:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

                log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]);

       }
 }

это напечатало бы

       arg1 == arg1
2 голосов
/ 13 ноября 2013

Эта команда работает:

sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto
1 голос
/ 06 ноября 2014

Я нашел способ использовать sc.

sc config binPath = "\" c: \ путь с пробелами в нем \ service_executable.exe \ ""

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

0 голосов
/ 10 июля 2019
C:\Windows\system32>sc.exe create teagent binpath= "\"C:\Program Files\Tripwire\TE\Agent\bin\wrapper.exe\" -s \"C:\Program Files\Tripwire\TE\Agent\bin\agent.conf\"" DisplayName= "Tripwire Enterprise Agent"

[SC] CreateService SUCCESS
0 голосов
/ 25 декабря 2016

Если вы попробовали все вышеперечисленное и по-прежнему не можете передать аргументы своему сервису, если ваш сервис написан на C / C ++, вот в чем может быть проблема: когда вы запускаете свой сервис через "sc start arg1 arg2. .. ", SC вызывает функцию ServiceMain вашего сервиса напрямую с этими аргументами. Но когда Windows запускает ваш сервис (например, во время загрузки), вызывается основная функция вашего сервиса (_tmain) с параметрами из «binPath» реестра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...