使用SC.exe或InstallUtil.exe安装Windows服务-有区别但是哪个更好?

51

SC.exeInstallUtil都可以用于安装/卸载Windows服务。但它们似乎工作方式不同。

有何区别?


例如,当我使用InstallUtil时会失败(出现某些文件或依赖项未找到的错误),而Sc create则可以顺利安装该服务,但是如果我在控制台中运行net start,该服务将不会显示。不过在服务GUI中该服务确实会显示。

当我尝试卸载服务时也会发生类似的情况。

该服务是我自己编写的,早期版本可以正常工作,使用了Dotnet3.5。


1
这里有一个警告:如果您在控制面板中打开了服务,则无法卸载(我记不清是sc.ex还是installUtil)。 - LosManos
也许发帖者遇到了和我一样的错误:在使用InstallUtil时,我尝试在App.config中配置服务名称。结果发现,如果从配置文件中读取,我们无法安装该服务(可能是依赖关系问题)。最终,我们决定硬编码服务名称,然后转换为使用SC。 - Hoàng Long
5个回答

29

是的,安装服务并不特别复杂。这只需要写入一些注册表键值。您可以使用 Regedit.exe 查看并可以导航到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services。

Sc.exe 也可以使用提供的命令行参数来编写这些键值。然而,这不是正确的做法。InstallUtil.exe 的用途在于它可以激活自定义安装代码。这是服务作者编写的代码。这并不罕见,服务往往会将配置信息放在其注册键中以供自己使用。当您使用Regedit查看时,会看到大量的证据。


4
特别地,sc.exe 不会创建 Windows 事件日志所需的条目,而 .NET 基于服务通常使用该事件日志。 - Christian.K
我相信我们总是可以在服务本身中编写任何自定义代码吧?到目前为止,我还没有看到InstallUtil能做什么而SC不能做的。对于Windows事件日志,如果必要的话,我们可以自己创建(虽然我们并不经常使用事件日志)。也许SC自上次以来有所改进了? - Hoàng Long
2
它可以找到带有[Installer]属性的.NET代码并执行它。SC.exe无法做到这一点。这是微软记录的方式,您不必按照这种方式操作。 - Hans Passant
1
为什么不在服务内创建事件日志?因为服务通常以比安装期间拥有的权限更少的权限运行。 - Assaf S.

17

我更喜欢使用sc.exe而不是installutil.exe。

使用InstallUtil强制你添加可怕的ProjectInstaller类,并在其中硬编码服务名称和服务描述。

使用InstallUtil非常难以在同一台机器上同时运行两个相同服务的不同版本。

这就是为什么我根本不使用InstallUtil.exe。还因为先前的响应:你需要将其包含在部署包中。sc.exe已经存在于任何Windows XP及以上版本中(我相信)。


5
这不是真的,你不需要硬编码服务名称。 通过添加几行额外的代码,在使用installutil安装时提供服务名称即可。 - furier
我不知道,虽然我从未认真考虑过。谢谢你提供的信息。 - Kat Lim Ruiz
1
@furier - 我知道这是一个旧评论,但您能展示一下如何为该服务提供名称吗? - Jeremy
在命令提示符中输入:sc create help,它会告诉您语法,其中包括DisplayName。 - Kat Lim Ruiz
@Wjdavis5 你好,我可以了解一下为什么它是不正确的吗? - Kat Lim Ruiz
显示剩余11条评论

5
主要区别在于InstallUtil不是用于服务安装的实用工具,而是通用的安装程序工具。从MSDN页面中可以看到:
“Installer工具是一个命令行实用程序,允许您通过执行指定程序集中的安装程序组件来安装和卸载服务器资源。此工具与System.Configuration.Install命名空间中的类配合使用。”
因此,它可以安装服务,但它还有许多其他好处。基于Installer Class创建可执行文件,可以对整个安装/卸载过程进行编程控制。ServiceInstallerServiceProcessInstaller,例如,是用于安装服务的。
'sc'实用程序用于服务控制,'create'命令将根据所选可执行文件创建服务。
在您的示例中: 1.它不应使用InstallUtil进行安装,错误响应应该非常明确。 2.InstallUtil失败是由于安装代码中的错误,使用sc create可能会为您创建一个有故障的服务。请检查{exe_name} .InstallLog获取详细信息。

sc 命令也会创建日志。 - Hoàng Long
@HoàngLong 你确定吗?日志文件的名称是什么? - Bizniztime
日志文件是[文件名].InstallLog和[文件名].InstallState()。 InstallLog包含诸如“安装程序集...受影响的参数是...”之类的内容。 InstallState是一个XML文件。我非常确定,因为我以前在我们的服务器上做过(也许自你写答案以来有所改变)。 - Hoàng Long
1
@HoàngLong 这些是由 InstallUtil 创建的,而不是 sc。 - Bizniztime
刚刚再次仔细检查了一遍,发现我的其中一个服务生成了日志,而另一个没有(两者都使用SC)。很奇怪。再次仔细检查了一切,似乎这两个服务是相似的。我唯一看到的区别是一个需要使用用户名/密码的帐户进行设置,而另一个则不需要(帐户=ServiceAccount.User与帐户=ServiceAccount.LocalSystem)。 - Hoàng Long
显示剩余2条评论

3
虽然InstallUtil是处理.NET服务的首选方法之一,但它的一个缺点是它不会从您的app.config中读取绑定重定向,这在某些情况下可能会导致安装失败。这就是使用SC可能会带来一些好处的地方,但代价是无法在安装时运行代码。
不幸的是对于OP来说,在他提问的时候TopShelf还不存在。它解决了SC和InstallUtil的缺点,并允许在Visual Studio中启动服务时附加调试器。此外,键入myservice install要比深入到特定文件夹以使用InstallUtil或键入大量参数以使用SC更容易。

2
从卸载使用经验来看: 在Windows 7下,sc.exe立即从列表中删除条目,而使用installutil卸载后需要重新启动。

请查看原始问题中的注释。我相信您已经在控制面板中打开了服务列表。 - LosManos
sc可以在窗口打开的情况下工作,但installutil不行,至少对我来说是这样。 - Cyryl Płotnicki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接