使用sc.exe创建服务时如何传入上下文参数?

时间:2010-09-07 22:54:07

标签: windows-services

使用以下方法创建Windows服务时:

sc create ServiceName binPath= "the path"

如何将参数传递给Installer类的Context.Parameters集合?

我对sc.exe文档的阅读是这样的论证只能在binPath的末尾传递,但我没有找到一个例子或者能够成功地做到这一点。

14 个答案:

答案 0 :(得分:231)

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

诀窍是在create语句中的=后面留一个空格,并且对包含特殊字符或空格的任何内容使用“”。

建议为服务指定显示名称,并将开始设置设置为自动,以便自动启动。您可以通过在create statement中指定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

答案 1 :(得分:130)

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

如果要为服务输入命令行参数,则必须将整个命令行括在引号中。 (并且总是在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中的所有反斜杠都不会被转义

答案 2 :(得分:11)

sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

见这里:Modifying the "Path to executable" of a windows service

答案 3 :(得分:5)

我在Windows 7上运行时遇到了问题。它似乎忽略了我传入的第一个参数,因此我使用binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"并且它有效。

答案 4 :(得分:4)

我用它来创建没有参数的,然后编辑注册表HKLM\System\CurrentControlSet\Services\[YourService]

答案 5 :(得分:2)

此命令有效:

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

答案 6 :(得分:2)

考虑如何访问应用程序代码中的Arguments也很重要。

在我的c#应用程序中,我使用了ServiceBase类:

 class MyService : ServiceBase
{

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

我使用

注册了我的服务

sc create myService binpath =&#34; MeyService.exe arg1 arg2&#34;

但是当我将其作为服务运行时,我无法通过args变量访问参数。

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

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

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

这会打印

       arg1 == arg1

答案 7 :(得分:1)

我找到了一种使用sc的方法。

sc config binPath =&#34; \&#34; c:\ path中包含空格\ service_executable.exe \&#34; &#34;

换句话说,使用\来逃避任何想要在转入注册表后继续存在的问题。

答案 8 :(得分:0)

确保在binPath值的开头和结尾都有引号。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

如果您尝试了以上所有方法但仍然无法将args传递给您的服务,如果您的服务是用C / C ++编写的,那么可能就是问题所在:当您通过“sc start arg1 arg2”启动服务时。 ..“,SC直接用这些args调用你服务的ServiceMain函数。但是,当Windows启动您的服务时(例如,在启动时),它是您的服务的主要功能(_tmain)被调用,使用来自注册表的“binPath”的参数。

答案 11 :(得分:0)

使用反斜杠使用许多双引号的服务创建示例。

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

答案 12 :(得分:0)

它在Powershell中不起作用,在我的情况下应该使用CMD

答案 13 :(得分:0)

W2008 Server 中,您仍然需要空间,例如binPath= "",但在 W2019 Server已修复binPath="" 有效