sc.exe로 서비스를 만들 때 컨텍스트 매개 변수를 전달하는 방법은 무엇입니까?


143

다음을 사용하여 Windows 서비스를 작성할 때 :

sc create ServiceName binPath= "the path"

어떻게 인수를 Installer 클래스의 Context.Parameters 컬렉션에 전달할 수 있습니까?

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”
sympatric greg

Installutil.exe를 사용했고 이전 기술에는 Windows XP / 2003 Resource Ket의 Instsrv.exe를 사용했습니다.
게리 킨델

답변:


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

비결은 create 문에서 = 뒤에 공백을 남기고 특수 문자 나 공백을 포함하는 모든 항목에 ""를 사용하는 것입니다.

서비스의 표시 이름을 지정하고 자동으로 시작되도록 시작 설정을 자동으로 설정하는 것이 좋습니다. 당신은 지정하여이 작업을 수행 할 수 있습니다 DisplayName= yourdisplaynamestart= 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:\...") 뒤에 공백이 있어야 합니다. 그렇지 않으면 작동하지 않습니다.
Onion-Knight

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
args에서 "="뒤에 공백이 없으면 (예 : binPath= ...DisplayName= ...; 필자의 경우 DisplayName 뒤에 "="를 잊어 버린 경우) 콘솔에서 create명령 의 사용법 지시 사항을 인쇄합니다 . like : DESCRIPTION: Creates a service entry... USAGE: sc <server> create....etc
The Red Pea

3
"="뒤에 공백은 매우 중요합니다
ErisoHV

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 내의 모든 추가 따옴표는 백 슬래시로 이스케이프됩니다. \"
  • binpath 내부의 모든 백 슬래시는 이스케이프되지 않습니다

7
binPath =와 "myservice.exe"값 사이에 공백이 있는지 확인하는 것이 중요하다는 것을 알았습니다. 즉 binPath= "myservice.exe. 명령 행 인터프리터는이를 예상하고 공백을 구분 기호로 사용하여 명령을 토큰 화해야합니다.
mrswadge

나는 이런 식으로 시도했고 효과가 있었다. SC.EXE "\\ ServerName" "ServiceName"생성 BinPath = "SampleService.exe"
Sai


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 create 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

Main 메소드의 args 매개 변수에서 arg1 및 arg2를 가져올 수도 있습니다.
Wojciech Mikołajewicz 2014 년

1

sc를 사용하는 방법을 찾았습니다.

sc 구성 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"경로가 주어지면 binPath = "c : \ abc \ def.exe / Param1 = ghi"와 같이 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가 서비스를 시작할 때 (예 : 부팅시) 레지스트리의 "binPath"에서 매개 변수를 사용하여 호출되는 서비스의 주요 기능 (_tmain)입니다.


0

Powershell에서 작동하지 않으며 제 경우에는 CMD를 사용해야합니다


PowerShell 5.1에서 수정
oetzi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.