用sc.exe创build一个服务; 如何传递上下文参数

当使用sc创buildServiceName binPath =“path”时,参数如何传递给Installer类的Context.Parameters集合?

我读到的sc.exe文件是这样的参数只能在binPath的末尾传递,但我还没有find一个例子或能够成功地做到这一点。

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

诀窍是在创build语句中的=之后留出空格,并且也可以使用“”来包含特殊字符或空格。

build议为服务指定显示名称,并将启动设置设置为自动,以便自动启动。 你可以通过在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

创build服务的参数有一些特殊的格式化问题,特别是如果命令包含空格或引号:

如果要input服务的命令行参数 ,则必须将整个命令行用引号引起来。 (在binPath=和第一个引号之前总是留出一个空格,就像mrswadge指出的那样)

因此,要为命令PATH\COMMAND.EXE --param1=xyz创build一个服务PATH\COMMAND.EXE --param1=xyz您可以使用以下binPath参数:

 binPath= "PATH\COMMAND.EXE --param1=xyz" ^^ ^ || | space quote quote 

如果可执行文件的path 包含空格 ,则必须将该path放在引号中。

因此,对于具有空格的参数path的命令,您需要嵌套的引号 。 你必须使用反斜杠来转义内部引号。如果参数本身包含引号,也是一样的,你也需要把它们转义出来。

尽pipe使用反斜杠作为转义字符,您不必转义path中包含的常规反斜杠。 这与通常使用反斜杠作为转义字符相反。

所以对于一个类似的命令
"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 

(换行符是为了便于阅读而添加的,不包括它们)

这将通过命令行"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"添加一项新服务。

所以总结

  • 每个sc参数之后的空间: binpath=_displayname=_depend=_
  • 每个包含空格的sc参数都必须用引号引起来
  • binpath中的所有其他引号都用反斜杠转义: \“
  • binpath中的所有反斜杠都不会被转义
 sc创build“YOURSERVICENAME”binpath =“\”C:\ Program Files(x86)\ Microsoft SQL Server \ MSSQL11 \ MSSQL \ Binn \ sqlservr.exe \“-sOPTIONALSWITCH”start = auto 

请参阅: 修改Windows服务的“可执行文件的path”

我有问题得到这个在Windows 7上工作。它似乎忽略了我传入的第一个参数,所以我用binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" ,它的工作。

我用它来创build它没有参数,然后编辑registryHKLM\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创buildmyService binpath =“MeyService.exe arg1 arg2”

但是当我把它作为服务运行时,我无法通过argsvariables访问参数。

MSDN文档build议不要使用Main方法来检索binPathImagePath参数。 相反,它build议将您的逻辑放在OnStart方法,然后使用(C#) Environment.GetCommandLineArgs();

要访问第一个参数arg1我需要这样做:

 class MyService : ServiceBase { protected override void OnStart(string[] args) { log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]); } } 

这将打印

  arg1 == arg1 

请确保在binPath值的开始和结尾处有引号。

我find了一个使用sc的方法。

sc config binPath =“\”c:\ path中有空格\ service_executable.exe \“”

换句话说,使用\来逃避任何你想要生存的过渡到registry。

我无法处理与您的提案的问题,最后与x86文件夹,它只能在使用环境variables的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} 

如果您尝试了上述所有内容,仍然无法将parameter passing给您的服务,如果您的服务是使用C / C ++编写的,则可能会出现以下问题:当您通过“sc start arg1 arg2 …”启动服务时, SC使用这些参数直接调用你的服务的ServiceMain函数。 但是,当Windows启动你的服务时(例如在启动时),这是你的服务的主要function(_tmain)被调用,从registry的“binPath”PARAMS。