【问题标题】:Get config file from virtualized folder UAC从虚拟化文件夹 UAC 获取配置文件
【发布时间】:2016-04-28 17:33:36
【问题描述】:

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

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

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

因此,问题是:有没有办法以编程方式从虚拟化的应用程序中了解 Windows 最终将虚拟化文件放置在何处?

【问题讨论】:

  • 您好,downvoter,这个问题有什么问题?

标签: windows winapi windows-vista uac


【解决方案1】:

这取决于旧应用程序的安装位置。用户可能已经安装在"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\",则没有虚拟化,程序可以直接写入该文件夹。

【讨论】:

  • 你的意思是 VirtualStore 路径总是 /VirtualStore 吗? Windows Vista 之后的所有 Windows 版本都是这样吗? (你有这方面的参考文件吗?)
  • 据我所知,该文件夹对于包括 Windows 7、8 和 10 在内的所有版本都位于同一位置。我不知道这方面的任何文档。这基本上是对非常老的程序的错误修复,可能没有任何文档。
  • VirtualStore 的路径(至少对于 Vista 和 Windows 7)记录在 Common file and registry virtualization issues in Windows Vista or in Windows 7 中。要检测应用程序是否会将其文件系统和注册表访问虚拟化,您可以使用GetTokenInformation(TokenVirtualizationEnabled)
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2011-12-02
  • 2011-12-03
  • 2010-10-03
  • 2012-08-18
  • 2012-11-22
相关资源
最近更新 更多