从虚拟化文件夹 UAC 获取配置文件

Get config file from virtualized folder UAC

我继承了一个遗留应用程序,该应用程序过去常常将其设置写入 C:\Program Files\<Company>\<ProgramName> 下的文件。

此应用程序早于 Windows Vista,因此不包含清单。因此,当安装在 Windows Vista 或更高版本上时,这些写入实际上会被重定向(虚拟化),并且设置文件最终会在其他地方——通常在 C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)\... 中(但如果我是正确的,这取决于在 Windows 版本上)。

现在我需要更新这个遗留应用程序,并将包含一个清单。设置文件现在需要存储在其他地方,可能在 %APPDATA% 中。问题是,当 'updated' 版本安装在旧版本之上时,如果它能以某种方式找到以前的设置文件并将其复制到新位置,那就太好了。

因此,问题是:有没有什么方法可以通过虚拟化的应用程序以编程方式知道Windows最终将放置虚拟化文件的位置?

这取决于旧应用程序的安装位置。用户可能已安装在 "c:\program files\...""c:\program files (x86)\" 或其他地方。

您必须找到旧的安装路径并删除盘符。例如:"c:\Program Files\Company\Old App" 变为 "Program Files\Company\Old App"

接下来,附加到 VirtualStore 路径。

例如:

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:\Program Files" 需要管理员权限才能写入数据。如果程序安装到不受保护的文件夹,例如 "c:\my programs\",则没有虚拟化,程序可以直接写入该文件夹。