为什么我可以重命名 Windows 服务可执行文件,而它是 运行?

Why am I able to rename a Windows Service executable while it is running?

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

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

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

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

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

影响:

  • 重命名后,可以放置不同版本的文件。
  • 如果您或自动更新过程无法放置新版本,则指向该可执行文件的任何服务都将无法在下次启动(restart/reboot)
  • 如果新版本有问题,例如错误或缺少依赖项,下次服务可能无法启动(restart/reboot)
  • 当你放置了新版本,但没有立即重启服务,那么它会在未来的任何时候激活,这不是管理员(和用户)在生产环境中喜欢的东西。

建议:

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