2016-04-28 15 views
0

C:\Program Files\<Company>\<ProgramName>のファイルに設定を書き込むために使用していたレガシーアプリケーションを継承しました。仮想化されたフォルダから設定ファイルを取得するUAC

このアプリケーションはWindows Vistaより前のバージョンであるため、マニフェストは含まれていません。したがって、Windows Vista以降にインストールすると、これらの書き込みは実際にリダイレクト(仮想化)され、設定ファイルは通常C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)\...になります(ただし、正しい場合はWindowsのバージョンによって異なります)。

このレガシーアプリケーションを更新する必要があり、マニフェストが含まれます。設定ファイルは、おそらく%APPDATA%のどこかに格納する必要があります。問題は、古いバージョンの上に '更新された'バージョンがインストールされている場合、以前の設定ファイルを見つけて新しい場所にコピーすることができればいいと思います。

が仮想化されたアプリケーションから、Windowsが最終的に仮想化されたファイルを配置する場所をプログラム的に知る方法はありますか?

+0

こんにちはdownvoter、何が問題ですか? – Grodriguez

答えて

2

これは、古いアプリケーションのインストール場所によって異なります。ユーザーは"c:\program files\..."または"c:\program files (x86)\"などの場所にインストールされている可能性があります。

古いインストールパスを見つけて、ドライブ文字を削除する必要があります。たとえば、"c:\Program Files\Company\Old App""Program Files\Company\Old App"

になります。次に、VirtualStoreパスに追加します。例えば

:この仮想化は、データを書き込むための管理者のアクセスを必要とする例"c:\Program Files"のために、保護されたフォルダに対してのみです

wchar_t *old_application_path = L"Program Files\\Company\\Old App Folder"; 
wchar_t path[300]; 

wchar_t *ptr; 
if (S_OK == SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ptr)) 
{ 
    wsprintf(path, L"%s\\VirtualStore\\%s", ptr, old_application_path); 
    CoTaskMemFree(ptr); 
} 

注意。プログラムが保護されていないフォルダにインストールされている場合(例:"c:\my programs\")、仮想化はなく、プログラムはそのフォルダに直接書き込むことができます。

+0

VirtualStoreのパスは常に/VirtualStoreですか?これは、Windows Vista以降のすべてのWindowsバージョンで当てはまりますか? (これに関する参考資料はありますか?) – Grodriguez

+1

私の知る限り、Windows 7,8、および10を含むすべてのバージョンのフォルダは同じ場所にあります。その点についてはわかりません。これは基本的には非常に古いプログラムのバグ修正です。ドキュメントがない場合もあります。 –

+0

VirtualStoreへのパス(少なくともVistaとWindows 7の場合)については、[Windows VistaまたはWindows 7の共通ファイルとレジストリの仮想化に関する問題](https://support.microsoft.com/en-us/kb/)に記載されています。 927387)。アプリケーションがファイルシステムとレジストリアクセスを仮想化するかどうかを検出するには、 'GetTokenInformation(TokenVirtualizationEnabled)'を使うことができます。 –

関連する問題