繁体   English   中英

为什么我可以在Windows Service可执行文件运行时对其重命名?

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

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

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

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

超级用户的此答案中获取 ,以及如何在用户运行EXE文件时覆盖它们?

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

启示:

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

建议:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM