2008-10-14 70 views
3

我有一個更新我們的產品的Windows服務。它將產品文件複製到臨時目錄(通常爲「C:\ Windows \ Temp」),修補二進制文件,然後使用MoveFileEx在重新引導時將文件複製回安裝目錄,通常爲「C:\ Program Files \ Product 」。安裝目錄中的文件從父文件夾繼承其安全屬性。複製,修補和重新啓動後,安裝目錄中的文件缺少一些ACL。特別是這些文件不再具有Users組的ACL,因此用戶在重新引導後不能再運行該程序。文件安全屬性越來越搞亂文件副本

任何人都可以解釋這是怎麼回事嗎?看起來,從安裝目錄複製到臨時目錄,這些文件繼承了臨時目錄的ACL。但是,在MoveFileEx/Reboot上,這些文件只會繼承安裝目錄和臨時目錄共有的ACL。

回答

4

在Windows中,如果複製文件,該文件將採用目標目錄的ACL。如果你移動一個文件,ACL會隨着它覆蓋任何可能從該目錄繼承的文件。我不確定MoveFileEx如何在文件上運行不同。

臨時目錄通常位於用戶配置文件(%TMP%和%TEMP%通常指向此處),因此在此處複製文件將具有該用戶的權限。將這些文件移動到程序文件目錄將僅對其擁有該用戶權限,因此只能由安裝用戶運行。

+0

我認爲這可能會引發這個問題。雖然有一個更正,但使用ususal特權運行的服務的%TEMP%目錄是C:\ Windows \ Temp,而不是特定用戶的臨時目錄。 – Charles 2008-10-15 13:35:21

0

一個潛在的解決方法是在同一個目錄下使用不同名稱修補文件的副本。重新啓動後,可以交換已修補的版本。或者,先重新啓動,然後將其修補到原位,並在需要手動回滾的情況下將它們備份到臨時目錄。

如果您確實想將它們移動到其他位置,請在假定該目錄使用繼承權限的情況下,在要修補的文件的相同位置創建臨時文件夾,以幫助保持相同的權限。