При создании услуги с SC.EXE Как пройти в контекстные параметры?
-
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.
Другие советы
Параметры для созданных услуг имеют некоторые своеобразные формирующие проблемы, в частности, если команда включает в себя пробелы или цитаты:
Если вы хотите войти Параметры командной строки Для сервиса вы должны приложить вся командная строка в цитатах. (И всегда оставляйте пространство после 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