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

创建 Windows 服务时使用:

sc create ServiceName binPath= "the path"

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

我对 sc.exe文档的理解是,这样的参数只能在 binPath的末尾传递,但是我没有找到一个示例,也没有能够成功地做到这一点。

511490 次浏览

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

在 Windows7上运行这个程序时,我遇到了一些问题。它似乎忽略了我传入的第一个参数,所以我使用了 binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2",它起作用了。

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

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

建议为服务指定一个 Display Name,并将开始设置设置为 auto,以便自动启动。可以通过在 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

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

如果要为服务输入 命令行参数命令行参数,则必须在 整个命令行中加引号。(正如 mrswadge 所指出的,在 binPath=之后和第一个引用之前要留出空格)

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

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

如果 路径指向可执行文件 包含空格,则必须将 路径引号括起来。

因此,对于具有 都有参数 还有和带空格的路径的命令,您需要 嵌套的引用。 必须用反斜杠 \"转义内引号。如果参数本身包含引号,也需要转义这些引号。

尽管使用反斜杠作为转义字符,但您不必转义路径中包含的常规反斜杠。这与您通常使用反斜杠作为转义字符的方式相反。

所以像这样的命令
返回文章页面

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

下面是 SVNserver 文档中的一个具体例子,它显示了所有特殊情况:

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 中的所有其他引号都用反斜杠转义: \"
  • 并没有转义所有的反斜杠

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

我无法处理你的提案中的问题,在 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}

这个命令有效:

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

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

Sc config binPath = ““ c: path with space in it service _ Executive. exe””

换句话说,用来转义任何你想存活到注册表中的过境。

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

看这里: 修改 Windows 服务的“可执行路径”

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

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

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

 class MyService : ServiceBase
{


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

我注册了我的服务

Sc create myService binpath = “ MeyService.exe arg1 arg2”

但是当我将它作为服务运行时,我无法通过 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

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

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

它在 Powershell 不起作用,对我来说应该使用 CMD

W2008服务器中你仍然需要空间,例如 binPath= "",但是在 W2019服务器中它是 修好了,而 binPath=""工作