При создании сервиса с sc.exe как передать параметры контекста?

При создании службы Windows используется:

sc create ServiceName binPath= "the path"

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

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

Ответ 1

sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

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

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

Ответ 2

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

Если вы хотите ввести параметры командной строки для службы, вы должны заключить целую командную строку в кавычки. (И всегда оставляйте пробел после 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, содержащий пробелы, должен быть заключен в кавычки
  • все дополнительные кавычки внутри пути bin экранированы обратными косыми чертами: \"
  • все обратные косые черты внутри пути bin не экранируются

Ответ 4

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

Ответ 5

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

Ответ 6

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

sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto

Ответ 7

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

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

 class MyService : ServiceBase
{

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

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

sc создать myService binpath = "MeyService.exe arg1 arg2"

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

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

Для доступа к первым аргументам arg1 мне нужно сделать вот так:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

это напечатает

       arg1 == arg1

Ответ 8

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

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

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

Ответ 9

Обязательно укажите кавычки в начале и конце вашего значения binPath.

Ответ 10

Я не мог справиться с этой проблемой с вашими предложениями, в конце с x86-папкой она работала только в командной оболочке (windows server 2012) с использованием переменных среды:

{sc.exe create svnserve binpath= "${env:programfiles(x86)}/subversion/bin/svnserve.exe --service -r C:/svnrepositories/"   displayname= "Subversion Server" depend= Tcpip start= auto}

Ответ 11

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

Ответ 12

Пример создания сервиса с использованием обратной косой черты с множеством двойных кавычек.

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