0

我使用 Visual Studio 2012 开发了一个包含 Windows 服务的解决方案。VS 2012 删除了创建安装程序的功能,因此我使用了一个很好地集成到 Visual Studio 中的用于安装程序生成的第 3 方工具 (WiX)。

我的问题是,虽然 WiX 能够安装具有自动启动/停止类型的服务,但它无法安装在启动时启动的服务。

我已经阅读了许多关于为非管理员用户启动和停止服务的文章,但是对于使用带有“net start myservice”的批处理脚本是否真的适用于非管理员用户似乎有些困惑。我不愿意尝试提升指定用户对指定服务的权限之类的事情,因为它需要适用于任何安装应用程序套件的用户。同样,我不愿意弄乱组策略,因为:

a) 项目需要由简单的安装程序安装,而用户不必摆弄类似的东西 b) 目标机器上的任何用户都需要能够启动服务

所以我的问题是:

  1. 是否有一种不错的、简单的、保证为非管理员用户工作的方式来启动服务?
  2. 是否有另一种方法可以为能够在启动时启动服务的 Windows 服务创建安装程序?
  3. 是否有可以作为安装程序的一部分运行的批处理脚本或其他一些构建后操作,以使服务在启动时启动?

任何其他有关如何解决此问题的建议将不胜感激。

4

1 回答 1

0

事实证明,用户错误是错误的:我的服务依赖于另一个服务(MSMQ aka Microsoft Message Queuing),并且它在 MSMQ 之前尝试并未能启动。这里的问题是双重的:

  1. 访问消息队列的尝试导致了未处理的异常,该异常记录在应用程序日志中,但未记录在我的服务特定日志中(因为它未处理)
  2. 安装服务时,我没有包含对 MSMQ 的引用。

我解决了这些问题

  1. 确保对消息队列的引用被 try catch 包围,该 try catch 将错误记录到我的应用程序日志中
  2. 我没有像任何其他程序那样启动我的服务,而是将我的大部分初始化代码移动到另一个函数中,如果成功则返回一个布尔值。如果不成功,我会等待 x 秒,然后重试最多 y 次重试,其中 x 和 y 是可配置的
  3. 在我的 wix 安装程序文件中添加服务引用。

WiX 参考如下所示:

<ServiceInstall Id="ServiceNameId" Type="ownProcess" 
                Name="ServiceName" DisplayName="Service Display Name" 
                Description="Service Description" Start="auto" 
                Account="LOCALSYSTEM" ErrorControl="normal">
    <ServiceDependency Id="MSMQ" />
</ServiceInstall>
于 2013-06-18T09:56:03.533 回答