从虚拟化文件夹获取配置文件UAC
我已经继承了一个遗留应用程序,用于将其设置写入C:\Program Files\<Company>\<ProgramName>
下的文件。从虚拟化文件夹获取配置文件UAC
此应用程序预先计划Windows Vista,因此不包含清单。因此,当安装在Windows Vista或更高版本上时,这些写入实际上会被重定向(虚拟化),并且设置文件将最终到达其他地方 - 通常在C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)\...
(但是如果我正确的话,这取决于Windows版本)。
现在我需要更新这个遗留应用程序,并将包括一个清单。现在需要将设置文件存储在其他地方,可能是%APPDATA%。问题是,当“更新”版本安装在旧版本的顶部时,如果它能以某种方式找到以前的设置文件并将其复制到新位置,那将会很好。
因此,问题:有没有什么办法可以编程地知道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\"
,则不存在虚拟化,程序可以直接写入该文件夹。
您的意思是说VirtualStore路径始终是
据我所知,该文件夹是在所有版本,包括Windows 7,8和10在同一个地方。我不知道在这方面的任何文件。这基本上是一个很老的程序的错误修复,可能没有任何文档。 –
VirtualStore的路径,至少在Vista和Windows 7中,记录在[Windows Vista或Windows 7中的常见文件和注册表虚拟化问题]中(https://support.microsoft.com/en-us/kb/ 927387)。要检测应用程序是否将文件系统和注册表访问虚拟化,可以使用'GetTokenInformation(TokenVirtualizationEnabled)'。 –
Hi downvoter,这个问题出了什么问题? – Grodriguez