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

Posted

技术标签:

【中文标题】使用 SC.exe 或 InstallUtil.exe 安装 Windows 服务 - 有区别,但哪个?【英文标题】:installing windows service with SC.exe or InstallUtil.exe - there is difference but which? 【发布时间】:2011-06-09 04:48:03 【问题描述】:

SC.exeInstallUtil 都安装/卸载 windows 服务。但它们的工作方式似乎不同。

有什么区别?


例如 InstallUtil 失败(找不到某些文件或依赖项错误),而 Sc create 愉快地安装了服务。太增加了陌生感;如果我在控制台中运行 net start,该服务不会显示。但它确实显示在服务 GUI 中。 当我尝试卸载时会发生这种情况。

我自己编写了该服务,早期版本也可以使用。 dotnet3.5.

【问题讨论】:

这里有一个警告:如果您在控制面板中打开了服务,则无法进行卸载(不记得是 sc.ex 还是 installUtil)。 也许 OP 遇到了同样的错误:使用 InstallUtil 时,我尝试在 App.config 中配置服务名称。事实证明,如果我们从配置文件中读取(必须是依赖项),我们无法安装服务。最后,我们决定硬编码服务名称。然后切换到SC 【参考方案1】:

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

InstallUtil 强制您添加可怕的 ProjectInstaller 类(我相信)并在其中硬编码服务名称和服务描述。

InstallUtil 使得在同一台机器上同时运行同一服务的两个版本变得非常困难。

这就是我根本不使用 InstallUtil.exe 的原因。也因为之前的回复:您需要它在您的部署包中。 sc.exe 已经在任何 Windows Xp 及更高版本中(我相信)。

【讨论】:

这不是真的,您不需要硬编码服务名称。通过一些额外的几行代码,您可以在使用 installutil 安装服务时提供服务的名称 我不知道,虽然我从来没有考虑过。感谢您的信息 @furier - 我知道这是一条旧评论,但你能说明你是如何为服务提供名称的吗? 输入命令提示符:sc create help,它会告诉你语法,有DisplayName 如何使用 sc.exe 在远程主机上部署 Windows 服务?如何使用 sc.exe 而没有安装程序类来自动部署 WS?【参考方案2】:

虽然 InstallUtil 是使用 .NET 服务的首选方式,但它的缺点之一是它不会从您的 app.config 中获取绑定重定向,这在某些情况下可能会导致安装失败。这就是使用 SC 可能会为您带来一些好处的地方,但代价是无法在安装时运行代码。

不幸的是,对于 OP,TopShelf 在他提出问题时并不存在。它解决了 SC 和 InstallUtil 的缺点,并允许服务在 Visual Studio 中启动时使用附加的调试器启动。此外,输入 myservice install 比深入到 InstallUtil 的特定文件夹或为 SC 输入大量参数要容易得多。

【讨论】:

【参考方案3】:

主要区别在于 InstallUtil 不是用于服务安装的实用程序,而是作为通用安装工具。从 MSDN 页面您可以看到:

“安装程序工具是一个命令行实用程序,可让您 通过执行安装程序来安装和卸载服务器资源 指定组件中的组件。此工具配合使用 System.Configuration.Install 命名空间中的类。"

所以它可以安装服务,但它还有许多其他好处。基于Installer Class 创建可执行文件可让您以编程方式控制整个安装/卸载过程。例如,ServiceInstaller 和 ServiceProcessInstaller 用于服务安装。

“Sc”实用程序用于服务控制,“create”命令将根据选择的可执行文件创建服务。

在你的例子中 1. 不是用InstallUtil安装的,错误响应应该很清楚。 2. InstallUtil 失败是因为安装代码中的错误和使用 sc create 可能会为您创建一个错误的服务。查看 exe_name.InstallLog 了解详细信息。

【讨论】:

sc 也会创建日志 @HoàngLong 你确定吗?日志文件的名称是什么? 日志文件是[Filename].InstallLog和[Filename].InstallState()。 InstallLog 包含诸如“正在安装程序集...受影响的参数是...”之类的内容。InstallState 是一个 XML 文件。我很确定,因为我之前在我们的服务器上做过(也许自从你写了答案后它会改变)。 @HoàngLong 这些是由InstallUtil而不是sc创建的 刚刚再次仔细检查。结果我的一项服务产生了日志,另一个没有(都使用 SC)。奇怪的。仔细检查所有内容,似乎两种服务都相似。我看到的唯一区别是一个需要一个具有用户名/密码的帐户才能设置,而另一个不需要(Account = ServiceAccount.User vs. Account = ServiceAccount.LocalSystem)【参考方案4】:

从卸载使用体验来看: windows 7下的sc.exe会立即从列表中删除该条目,而使用installutil卸载后需要重新启动

【讨论】:

查看原始问题中的评论。我相信您已经在控制面板中打开了服务列表。 sc 在窗口打开的情况下工作,installutil 不是,至少对我而言【参考方案5】:

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

Sc.exe 也可以使用提供的命令行参数编写这些密钥。然而,这不是正确的方法。 InstallUtil.exe 的重点是它可以激活自定义安装代码。服务作者编写的代码。这并不少见,服务倾向于在其注册密钥中填充配置信息以供自己使用。当您使用 Regedit 查看时,您会看到大量证据。

【讨论】:

特别是,sc.exe 不会为 .NET 基础服务通常使用的 Windows 事件日志创建所需的条目。 我相信我们总是可以在服务本身内部编写我们需要的任何自定义代码?做一些项目到现在,我还没有看到 InstallUtil 能做什么,而 SC 不能。对于 Windows 事件日志,如果需要,我们可以自己创建(虽然我们不使用太多的事件日志)。也许 SC 比上次有所改善? 它可以找到带有[Installer]属性的.NET代码并执行它。 SC.exe 无法做到这一点。这是 Microsoft 记录它的方式,您不必这样做。 为什么不在服务内创建事件日志?因为该服务的运行权限通常少于您在安装期间的权限

以上是关于使用 SC.exe 或 InstallUtil.exe 安装 Windows 服务 - 有区别,但哪个?的主要内容,如果未能解决你的问题,请参考以下文章

Windows下使用命令sc.exe查看服务状态管理服务

sc.exe用法详解

sc.exe如何设置windows服务的描述?

使用 sc.exe 使用当前用户帐户创建 Windows 服务

安装 C# 后,无法使用 WPF App 使用 SC.exe 创建 Windows 服务

cmd sc.exe 添加一个服务 以MongoDB为例