如何通过其他Windows服务创建Windows服务

时间:2011-08-23 17:40:43

标签: c# windows service

我在开发应用程序时遇到了一些麻烦。 这是一个场景:我有两个用C#编写的Windows服务(服务A和服务B)。

服务A负责在两个应用程序之间传输数据(使用Web服务,FTP连接等)。它还负责更新服务B.

服务B负责更新服务A并更新Web应用程序。

更新的基本操作是(假设这是更新服务A的过程,由服务B完成):

  1. 通过WebServices检查更新
  2. 如果有新版本,请停止服务(使用C#ServiceController)。
  3. 备份服务的当前文件(如果出现问题,我可以进行回滚)
  4. 卸载服务(使用sc delete命令)
  5. 下载服务的更新文件(使用FTP连接)
  6. 执行一些SQL Server脚本(如果存在)
  7. 安装Windows服务(使用sc create命令)
  8. 启动服务(使用C#ServiceController)
  9. 一切顺利运行到第7步。我认为问题在于执行更新的用户(运行服务B的用户)没有创建新Windows服务的权限,因此SC Create总是返回类似&#34的内容; [SC] OpenSCManager失败5:访问被拒绝"  请注意,我使用LocalSystem帐户运行这两个服务。因此,我认为此帐户无法创建新的Windows服务(如果我认为错误,请更正我)。

    在此之后,我创建了一个新的Windows用户,只是为了运行这些服务。这个想法是为这个用户提供必要的权限(网络共享,文件和创建服务)。但是,该用户仍然无法创建服务。

    以下是我尝试的内容:

    1. 为用户提供cmd.exe和sc.exe权限(使用CACLS)。
    2. 使用PsExec直接运行cmd(使用-i -s)而不是cmd.exe。
    3. 使用SubInAcl命令,以便用户具有两个Windows服务的权限。但事情就是这样,当时我没有任何服务,所以它不起作用。
    4. 有人说:

      • 此Windows服务没有任何安装程序。
      • 使用C#ProcessStartInfo运行SC命令。
      • SC命令指定我已创建的Windows用户的用户和密码。
      • 我真的不希望Windows服务在具有管理权限的用户帐户下运行。

      我知道这个帖子类似于已经在这里的Auto-update a Windows Service,但是我无法在任何地方找到任何可行的解决方案。

      对于长篇文字

      抱歉

1 个答案:

答案 0 :(得分:2)

我认为你的基本设计很脆弱。您不应该在正常服务操作中删除和创建服务。

我会做的是安排任何需要更新的服务能够自行完成。基本上将所有需要更新的代码放在DLL中。服务EXE中的代码只是一个瘦主机,负责加载主DLL并调用它的主处理循环。当EXE确定是时候更新它时,下载新的DLL,可能是通过正确下载的哈希来检查。接下来,处理循环终止,卸载旧DLL,加载新DLL并再次启动处理循环。

这种方法不那么具有侵入性,可以避免所有权限和权利问题。您可以编写单个服务主机EXE,并且有多个包含逻辑的DLL。