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

问题描述:

我已经继承了一个遗留应用程序,用于将其设置写入C:\Program Files\<Company>\<ProgramName>下的文件。从虚拟化文件夹获取配置文件UAC

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

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

因此,问题:有没有什么办法可以编程地知道Windows将最终放置虚拟化文件的位置,从应用程序而不是虚拟化?

+0

Hi downvoter,这个问题出了什么问题? – Grodriguez

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

+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)'。 –