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

任何人都可以解释这里发生的事情吗?似乎从安装目录复制到临时目录,文件继承临时目录的ACL。但是,在MoveFileEx / Reboot上,这些文件只继承了install和temp目录共有的ACL。

有帮助吗?

解决方案

在Windows中,如果复制文件,则文件将占用目标目录的ACL。如果你移动一个文件,那么ACL就会覆盖它覆盖它可能从该目录继承的任何文件。我不确定MoveFileEx如何在文件上以不同的方式运行。

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

其他提示

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

如果您确实想将它们移动到其他位置,则在要修补的文件所在的位置创建临时文件夹将有助于权限保持不变,假设目录使用的是继承权限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top