为什么我能够在运行时重命名Windows服务可执行文件?

时间:2017-03-17 07:44:55

标签: windows windows-services

我有一个用当前正在运行的托管语言(.NET Framework v4.0)编写的Windows服务。

出于某种原因,我可以在服务运行时重命名服务主可执行文件。 我怀疑该文件在服务运行时被Windows锁定,但事实并非如此。 更有趣的是,它在重命名后仍然存在于任务管理器中。

我不是在抱怨这是可能的,但我想知道为什么。有人对此有解释吗?

1 个答案:

答案 0 :(得分:1)

取自this answer on superuser, 和How can we overwrite EXE files while users are running them?

非独占锁定的可执行文件可以重命名。 Windows服务管理器获取服务可执行文件的文件句柄,只要服务运行它就会保持打开状态,并且完全不受重命名的影响。它不会锁定目录条目本身。因此,可执行文件可以被其他进程读取,并且可以重命名该文件的目录条目。

意义:

  • 重命名后,可以放置不同版本的文件。
  • 如果您或自动更新过程无法放置新版本,则指向该可执行文件的任何服务都将无法在下次启动时(重启/重启时)
  • 如果新版本存在问题,例如错误或缺少依赖项,则服务可能无法在下次启动时(重启/重启时)
  • 当您放置新版本但未能立即重新启动服务时,它将在以后的任何时间变为活动状态,这不是管理员(和用户)在生产环境中的状态。

建议:

  • 不要依赖这种机制。让您的更新过程停止服务。如果更新过程没有足够的权限,则更新失败。然后替换可执行文件和所有依赖项,然后重新启动服务。