3


1

私は私達の製品をアップデートするwindowsサービスをしています。 製品ファイルを一時ディレクトリ(通常は "C:\ Windows \ Temp")にコピーし、バイナリにパッチを適用してから、MoveFileExを使用して再起動時にファイルをインストールディレクトリにコピーします(通常は "C:\ Program Files \ Product")。 " インストールディレクトリ内のファイルは、親フォルダからセキュリティ属性を継承しています。 コピー、パッチ適用、および再起動後、インストールディレクトリ内のファイルにいくつかのACLがありません。 具体的には、ファイルにUsersグループのACLがなくなったため、ユーザーは再起動後にプログラムを実行できなくなります。

誰がここで起こっていることを説明できますか? インストールディレクトリから一時ディレクトリにコピーすると、ファイルは一時ディレクトリのACLを継承するようです。 ただし、MoveFileEx / Rebootでは、ファイルはinstallディレクトリとtempディレクトリの両方に共通のACLのみを継承します。

2 Answer


4


Windowsでは、ファイルをコピーした場合、そのファイルは宛先ディレクトリのACLを引き継ぎます。 ファイルを移動すると、そのディレクトリから継承する可能性があるファイルを上書きしてACLが移動します。 MoveFileExがファイルに対して異なる動作をする可能性があるかどうかわかりません。

一時ディレクトリは通常、ユーザープロファイルの下にあります(通常%TMP%と%TEMP%の両方がここを指しています)ので、ここにファイルをコピーするとそのユーザーのアクセス許可が与えられます。 これらのファイルをprogram filesディレクトリに移動しても、そのユーザーだけがそれらのファイルにアクセスできるので、インストールユーザーが実行することしかできません。


0


1つの潜在的な回避策は同じディレクトリにあるが異なる名前でファイルのコピーにパッチを当てることです。 再起動後、パッチが適用されたバージョンは入れ替わる可能性があります。 または、最初に再起動してから適切な場所にパッチを適用し、手動でロールバックする必要がある場合は一時ディレクトリにバックアップします。

本当に別の場所に移動したい場合は、パッチを適用するファイルと同じ場所に一時フォルダを作成すると、ディレクトリが継承されたアクセス許可を使用していると仮定してアクセス許可を同じに保つことができます。