web-dev-qa-db-ja.com

ファイルが「C:\ Users \ <username> AppData \ Local \ VirtualStore \ Program Files(x86)」に配置されるのはなぜですか?

最近、 Visual Basic 6. アプリケーションを更新し、 [〜#〜] uac [〜#〜] 仮想化を防ぐためにexe.manifestファイルを含めました。この更新プログラムを適用した後、一部のユーザーはデータファイル( Access MDBファイル)を見つけることができず、システム検索後にC:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)で見つけることになります。

このフォルダ領域は何のためにあり、どのように/いつファイルがこの領域に移動されますか?どうすればそれを防ぐことができますか?私のアプリケーションが.manifestこれは二度と起こらない。アプリケーションがUAC仮想化に配置されるときに、マニフェストが使用される前にファイルがそこに配置されましたか?

33
Neal

私の推測では、マニフェストはasInvokerであり、アプリはProgram Filesに書き込もうとしています。ユーザーがマニフェストなしで実行すると、プログラムファイルの仮想ストアに書き込まれます。これは、後でいくつかのファイルを見つけたパスです。それらがマニフェストで実行された場合、(アクセスが拒否されて)まったく書き込みに失敗しましたが、アプリケーションはそれらからエラーを隠したか、エラーを理解していないのであなたに言及しませんでした。

短期的な修正-requireAdministratorマニフェストを使用します。これはユーザーを苛立たせますが、書き込みは成功します。長期的な修正-ProgramFilesに書き込まないでください。 AppDataなどのユーザーごとのオプションがあります。

8
Kate Gregory

昇格された特権で実行されていないアプリケーションは、_Program Files_およびProgram Files (x86)ディレクトリにアクセスできません。これは安全性に優れています。さらに、ほとんどの場合開発者がプロ​​グラムに_Program Files_フォルダーにデータを保存するように指示した場合、たとえばプログラム設定は、プログラム設定がユーザーごとであることを完全に忘れました。事!つまり、ローカルコンピューター上のすべてのユーザーは、他のユーザーに影響を与えることなくプログラムを使用できる必要があります。言い換えれば、行儀の良いアプリケーションは代わりにその設定を保存する必要があります

_C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version> 
_

ディレクトリ。

たとえば、私のAlgoSimソフトウェアは、

_C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0
_

もちろん、

_C:\Users\<User Name>\AppData\Local\
_

実行時にパスを動的に検索する必要があります。使用する

_SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
_

このため。

Windows Vista以降、_Program Files_(またはProgram Files (x86))フォルダーに書き込もうとする特権を上げて実行していないアプリケーションは、実際には無意識のうちにVirtualStoreフォルダーに書き込みます。マイクロソフトは、これはプログラムの障害(アクセス制限が原因)よりも優れていると考えました。実際、これのおかげで、_Program Files_フォルダーに設定を保存するほとんどの古いプログラムはWindows Vista +で引き続き動作し、各ソフトウェアユーザーは、元のソフトウェアメーカーが行ったにもかかわらず、ボーナスとして独自の設定を取得しますこれを考えないでください。

マニフェストを使用して、アプリケーションがVirtualStoreを認識しており、Windowsが実行中にパスを変更してはならないことをWindowsに伝えることができます。しかし、本当に_Program Files_フォルダーに書き込みたい場合は、毎回、昇格した特権でアプリケーションを実行する必要があると思います。これは一般的にはお勧めできません。

マニフェストを作成してプログラムが各実行でUACプロンプトを表示する方法、およびVirtualStoreを無効にする方法の詳細については、以前のStack Overflowに関するいくつかの質問で対処されています。検索ボックスを自由に使用してください!

36