3

我有一个更新我们产品的 Windows 服务。它将产品文件复制到临时目录,通常是“C:\Windows\Temp”,修补二进制文件,然后在重新启动时使用 MoveFileEx 将文件复制回安装目录,通常是“C:\Program Files\Product ”。安装目录中的文件从父文件夹继承其安全属性。复制、修补和重新启动后,安装目录中的文件缺少一些 ACL。具体来说,这些文件不再具有用户组的 ACL,因此用户在重新启动后无法再运行该程序。

谁能解释这里发生了什么?似乎从安装目录复制到临时目录,文件继承了临时目录的 ACL。但是,在 MoveFileEx/Reboot 上,文件仅继承 install 和 temp 目录共有的 ACL。

4

2 回答 2

4

在 Windows 中,如果您复制文件,则该文件采用目标目录的 ACL。如果您移动一个文件,ACL 将覆盖它可能从该目录继承的任何文件。我不确定 MoveFileEx 对文件的操作可能会有所不同。

临时目录通常位于用户配置文件下(%TMP% 和 %TEMP% 通常都指向此处),因此在此处复制文件将具有该用户的权限。将这些文件移动到程序文件目录将只需要用户权限,因此只能由安装用户运行。

于 2008-10-14T22:16:41.777 回答
0

一种可能的解决方法是修补位于同一目录但名称不同的文件副本。重新启动后,可以换入已修补的版本。或者,先重新启动,然后就地修补它们,并在需要手动回滚时将它们备份到临时目录。

如果您真的想将它们移动到不同的位置,那么在要修补的文件所在的位置创建一个临时文件夹将有助于权限保持不变,前提是该目录使用继承的权限。

于 2008-10-14T22:26:48.200 回答