我在开发应用程序时遇到了一些麻烦。 这是一个场景:我有两个用C#编写的Windows服务(服务A和服务B)。
服务A负责在两个应用程序之间传输数据(使用Web服务,FTP连接等)。它还负责更新服务B.
服务B负责更新服务A并更新Web应用程序。
更新的基本操作是(假设这是更新服务A的过程,由服务B完成):
一切顺利运行到第7步。我认为问题在于执行更新的用户(运行服务B的用户)没有创建新Windows服务的权限,因此SC Create总是返回类似&#34的内容; [SC] OpenSCManager失败5:访问被拒绝" 请注意,我使用LocalSystem帐户运行这两个服务。因此,我认为此帐户无法创建新的Windows服务(如果我认为错误,请更正我)。
在此之后,我创建了一个新的Windows用户,只是为了运行这些服务。这个想法是为这个用户提供必要的权限(网络共享,文件和创建服务)。但是,该用户仍然无法创建服务。
以下是我尝试的内容:
有人说:
我知道这个帖子类似于已经在这里的Auto-update a Windows Service,但是我无法在任何地方找到任何可行的解决方案。
对于长篇文字
抱歉答案 0 :(得分:2)
我认为你的基本设计很脆弱。您不应该在正常服务操作中删除和创建服务。
我会做的是安排任何需要更新的服务能够自行完成。基本上将所有需要更新的代码放在DLL中。服务EXE中的代码只是一个瘦主机,负责加载主DLL并调用它的主处理循环。当EXE确定是时候更新它时,下载新的DLL,可能是通过正确下载的哈希来检查。接下来,处理循环终止,卸载旧DLL,加载新DLL并再次启动处理循环。
这种方法不那么具有侵入性,可以避免所有权限和权利问题。您可以编写单个服务主机EXE,并且有多个包含逻辑的DLL。