安装可由非管理员用户启动的Windows服务

时间:2013-06-17 09:11:03

标签: windows service visual-studio-2012 admin non-admin

我使用Visual Studio 2012开发了一个包含Windows服务的解决方案.VS 2012已经删除了创建安装程序的功能,所以我使用第三方工具进行安装程序生成(WiX),它可以很好地集成到Visual工作室。

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

我已经阅读了很多关于为非管理员用户启动和停止服务的文章,但是对于使用带有'net start myservice'的批处理脚本是否真的适用于非管理员用户似乎存在一些混淆。我不愿意尝试升级指定服务的指定用户的权限,因为它需要适用于安装应用程序套件的任何用户。同样地,我不愿意混淆群体政策,因为:

a)项目需要由一个简单的安装程序安装,用户不必操作这样的东西 b)目标机器上的任何用户都需要能够启动服务

所以我的问题是:

  1. 是否有一个很好的,简单的,有保证工作的非管理员用户启动服务的方式?
  2. 是否有另一种方法可以为Windows服务创建一个能够在启动时启动服务的安装程序?
  3. 是否有批处理脚本或其他一些构建后操作,我可以作为安装程序的一部分运行,以使服务在启动时启动?
  4. 我们将非常感激地接受有关如何解决此问题的任何其他建议。 感谢。

1 个答案:

答案 0 :(得分:0)

事实证明,用户错误是错误的:我的服务依赖于另一个服务(MSMQ又名Microsoft消息队列),它正在尝试并且无法在MSMQ之前启动。这里的问题有两个:

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

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