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

8 浏览
0 Comments

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

在使用以下代码创建Windows服务时:

sc create ServiceName binPath= "路径"

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

我阅读了sc.exe文档,发现这些参数只能在binPath的末尾传递,但我没有找到示例或成功实现这一点。

0
0 Comments

问题的原因是在使用sc.exe创建服务时,如何传递上下文参数。在上述代码中,创建了一个名为"YOURSERVICENAME"的服务,但没有提供上下文参数。

解决方法如下:

1. 使用sc.exe时,在binpath参数中包含所有必需的上下文参数。例如,可以使用以下命令来创建一个包含上下文参数的服务:

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

在上述命令中,-cPARAM1和-dPARAM2是两个示例上下文参数。

2. 参考上述代码中提供的链接,了解如何修改现有服务的可执行文件路径。在这个问题中,可能需要修改现有服务的可执行文件路径,以包含所需的上下文参数。

通过以上方法,可以在使用sc.exe创建服务时传递上下文参数。

0
0 Comments

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

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

如果要为服务输入命令行参数,必须用引号将整个命令行括起来。 (并且始终在binPath=之后和第一个引号之前留有一个空格,正如mrswadge所指出的那样)

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

binPath= "PATH\COMMAND.EXE --param1=xyz"
        ^^                             ^
        ||                             |
  空格    引号                     引号

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

因此,对于同时具有参数和带有空格的路径的命令,您需要嵌套引号。

您必须使用反斜杠\"转义内部引号。如果参数本身包含引号,您也需要转义这些引号。

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

因此,对于像这样的命令

"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"
         ^ ^                 ^           ^                      ^       ^         ^
         | |                 |           |                      |       |         | 
 开始引号    转义引号      常规反斜杠    转义引号                    转义引号       结束引号
   对于      对于            在         结束引号                      对于            对于
 整个命令                                                                       整个命令

下面是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中的所有反斜杠不进行转义

我发现确保在binPath=和值"myservice.exe"之间有一个空格很重要,即binPath= "myservice.exe。命令行解释器必须期望这样做,并要求使用空格作为分隔符将命令进行标记化。

我尝试了这种方法,它有效。SC.EXE "\\ServerName" Create "ServiceName" BinPath="SampleService.exe"

这应该在sc.exe create的MS文档中。

这个空格仍然相关吗?现在它可以无空格工作。我正在使用Windows 10。

0
0 Comments

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

创建服务的命令是sc create binpath= "" [option1] [option2] [optionN]。

技巧在于在create语句后面留出一个空格,并且对于包含特殊字符或空格的内容,使用" "。

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

请记住binPath=后面的空格(binPath= "C:\...")必须存在,否则无法正常工作。

-Knight 空格正是我丢失的部分。非常感谢!

start= auto是一个重要的设置,这样在重启后,服务将自动启动。这对于非专家用户非常有用。

如果您需要在binPath中传递需要引号的额外参数,它们必须被转义(例如:如果路径是c:\some long path\some.exe "first argument",则需要使用binPath= "\"c:\some long path\some.exe\" \"first argument\"")。

如果在参数(binPath= ...和DisplayName= ...)后面没有空格(例如在我的情况下,我忘记在DisplayName后面加上等号),控制台将打印create命令的用法说明,如:DESCRIPTION: Creates a service entry... USAGE: sc create...等等。

在我的情况下,我需要以管理员模式打开控制台,否则会出现"Access denied"。

等号后面的空格非常重要。

很好的答案。最棘手的部分是使用"\\"作为转义符号。

值得注意的是,该命令仅适用于Windows Server(和一些较旧的Windows版本)。Windows 10也有一个sc命令,但它是不同的,不能用于注册服务。

0