При создании услуги с SC.EXE Как пройти в контекстные параметры?

StackOverflow https://stackoverflow.com/questions/3663331

  •  01-10-2019
  •  | 
  •  

Вопрос

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

sc create ServiceName binPath= "the path"

Как аргументы могут быть переданы на контекст установщика класса Contex.parameters?

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

Это было полезно?

Решение

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

Хитрость состоит в том, чтобы покинуть пространство после того, как = в вашем операторе создания, а также в использовании «» для чего-либо, содержащего специальные символы или пробелы.

Целесообразно указать отображаемое имя для сервиса, а также установку настройки начать на 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

Если то дорожка к исполняемости содержит пробелы, вы должны приложить дорожка в цитатах.

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

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

Так что для команды, как
"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 

(Viewbreaks добавляются для чтения, не включают их)

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

Так что в резюме

  • Пространство после каждого параметра SC: binpath=_, displayname=_ а также depend=_
  • Каждый параметр SC, который содержит пробелы, должно быть заключено в цитаты
  • Все дополнительные цитаты внутри BINPATH сбежаются с обратной косами: \"
  • Все обратные косания внутри BINPATH не сбежаются
SC Создание «YourServiCeaname» 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 # я использовал класс ServiceBase:

 class MyService : ServiceBase
{

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

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

SC создать myservice binpath = "meyservice.exe arg1 arg2"

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

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

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

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

Это будет печатать

       arg1 == arg1

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

SC Config Binpath = "" C: Путь с пробелами в нем Service_executable.exe ""

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

Убедитесь, что цитаты в начале и конец вашей стоимости BINPATH.

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

Если вы пробовали все вышеперечисленное и до сих пор не можем пройти аргументы на ваш сервис, если ваш сервис был написан в C / C ++, вот что может быть проблемой: когда вы начнете свой сервис через «SC START ARG1 ARG2 ...» SC SC вызывает функцию обслуживания вашего сервиса напрямую с этими аргументами. Но когда Windows начнет вашу услугу (например, во время загрузки), это главная функция вашего обслуживания (_TMain), которая вызывается, с параматами из «BINPATH» реестра.

Пример создания услуг использует обратные кашию со многими двойными кавычками.

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top