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

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

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

最佳答案

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

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

含义:

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

  • 建议:
  • 不要依赖这个机制。让您的更新过程停止服务。当您的更新过程没有足够的权限来执行此操作时,更新失败。然后替换可执行文件和所有依赖项,并重新启动服务。
  • 关于windows - 为什么我可以在运行时重命名 Windows 服务可执行文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42851917/

    10-14 18:40
    查看更多