При создании службы с sc.exe, как передать параметры контекста?

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

sc create ServiceName binPath= "the path" 

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

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

     sc create  binpath= "" [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

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

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

     binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"abc\" --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 

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

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

    Итак, в резюме

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

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

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

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

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

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

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

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

      class MyService : ServiceBase { protected override void OnStart(string[] args) { } } 

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

    sc создать 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 

    Убедитесь, что у вас есть кавычки в начале и конце вашего значения binPath.

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

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

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

    Я не мог справиться с этой проблемой с вашими предложениями, в конце с x86-папкой она работала только в power shell (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} 

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

    Давайте будем гением компьютера.