Створюючи службу з sc.exe, як передати параметри контексту?


143

Під час створення служби Windows за допомогою:

sc create ServiceName binPath= "the path"

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

Я читаю sc.exeдокументацію, що такі аргументи можна було передати лише наприкінці binPath, але я не знайшов приклад або не зміг це зробити успішно.


Огляд клавіші Сервісу в Реєстрі говорить про те, що всі необхідні параметри включаються зі значенням ImagePath, тож вам binPath= "c:\abc\def.exe /Param1=ghi"здається правильною ідеєю. Чи потрібно відхиляти кососуші риски (тобто "c: \\ abc \\ ...")? Найгірше, що ви можете безпосередньо змінити значення Реєстру після цього, якщо SC.EXE не може цього зробити.
ewall

1
Я відмовився від SC.exe і я використовую Installutil.exe так: Installutil.exe / ServiceName = »TheName» / TARGETDIR = "C: \ TheInstallDirectory \" / PackageRoot = »PackageRootPath»
сімпатріческого Грегу

Я використовував Installutil.exe, а для старих технологій я використовую Instsrv.exe з Windows XP / 2003 Resource Ket.
Gary Kindel

Відповіді:


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

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

Доцільно вказати відображуване ім'я для послуги, а також встановити налаштування початку для автоматичного, щоб воно почалося автоматично. Ви можете зробити це, вказавши 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


39
Майте на увазі, що простір після binPath = ( binPath= "C:\...") повинен бути присутнім, інакше це не працюватиме.
Лук-лицар

1
start= autoє важливим, тому після перезавантаження послуга буде автоматично запущена. Дуже добре, якщо кінцевий користувач не є експертом
LaBracca

21
Крім того, якщо вам потрібно передати додаткові параметри в тих, binPathщо вимагають лапок, їх потрібно уникнути ( \") приклад: якби шлях був, c:\some long path\some.exe "first argument"він повинен бутиbinPath= "\"c:\some long path\some.exe\" \"first argument\""
Lankymart

1
Якщо у ваших аргументах немає місця після "=" (наприклад, binPath= ...і DisplayName= ..., в моєму випадку я забув "=" після DisplayName), консоль надрукує інструкції щодо використання createкоманди; як: DESCRIPTION: Creates a service entry... USAGE: sc <server> create....тощо
Червоний горох

3
Пробіли після
знаку

152

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

Якщо ви хочете ввести параметри командного рядка для послуги, вам слід укласти в лапки цілий командний рядок . (І завжди залишайте пробіл після 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 

(рядкові перерви додаються для читання, не включайте їх)

Це додало б нову службу з командним рядком "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories".

Отже, підсумовуючи

  • пробіл після кожного параметра SC: binpath=_, displayname=_іdepend=_
  • кожен параметр sc, який містить пробіли, повинен бути укладений у лапки
  • всі додаткові котирування всередині binpath вилучені із зворотним нахилом: \"
  • всі нахили від косого кута всередині пробігу не уникнуть

7
Я вважав, що важливо переконатися, що між binPath = і значенням "myservice.exe" є пробіл. тобто binPath= "myservice.exe. Інтерпретатор командного рядка повинен очікувати цього і вимагати, щоб команда стала токенізована, використовуючи пробіл як роздільник.
mrswadge

Я спробував так, і це спрацювало. SC.EXE "\\ ServerName" Створити "ServiceName" BinPath = "SampleService.exe"
Сай


5

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


4

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


2

Ця команда працює:

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

2

Також важливо враховувати, як ви отримуєте доступ до аргументів у коді програми.

У своєму додатку c # я використовував клас 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

Ви також можете отримати параметри arg1 та arg2 з параметрів args за методом Main.
Войцех

1

Я знайшов спосіб використовувати sc.

sc config binPath = "\" c: \ шлях з пробілами в ньому \ service_executable.exe \ ""

Іншими словами, використовуйте \, щоб уникнути будь-якого ви хочете пережити транзит до реєстру.


1

Приклад створення служби використання зворотних косих рисок з безліччю подвійних лапок.

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

Не забудьте мати лапки на початку та в кінці значення binPath.


1
Давши шлях "c: \ abc \ def.exe", я намагався пройти в Param1 = "ghi", як це: binPath = "c: \ abc \ def.exe / Param1 = ghi". Але не спрацьовує ...
симпатичний грег

0

Я не зміг вирішити проблему з вашими пропозиціями, наприкінці папки 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}

0

Якщо ви спробували все вищезазначене і досі не можете передати аргументи до вашої служби, якщо ваша служба була написана на C / C ++, ось у чому може бути проблема: коли ви запускаєте службу через "sc start arg1 arg2 ..." , SC викликає функцію служби ServiceMain безпосередньо за допомогою цих аргументів. Але коли Windows запускає вашу послугу (наприклад, під час завантаження, наприклад), вона називається основною функцією вашої служби (_tmain) з парами з "binPath" реєстру.


0

він не працює в Powershell і повинен використовувати CMD в моєму випадку


зафіксовано в PowerShell 5.1
oetzi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.