如何(通过程序)获取Windows UAC虚拟化文件的位置



我有一个32位windows旧应用程序(带有C/Win32源代码),它在可执行文件所在的同一文件夹中创建数据文件。

因为应用程序没有安装程序,用户可以将可执行文件放在他/她想要的任何地方,所以应用程序有一个对话框来通知用户其数据所在的位置。

但在Microsoft Vista/Seven下,如果用户将应用程序放在Program Files或任何其他受系统保护的文件夹中,则数据文件将被虚拟化并移动到虚拟存储中。

如果在Vista/Seven下,我仍然想通知用户数据文件的位置:(不阻止清单文件中的虚拟化)

  1. 如何(通过编程)知道数据文件是否已虚拟化?或者,如果可执行文件所在的文件夹意味着数据文件将被虚拟化?

  2. 假设我知道数据文件是虚拟的,我如何(通过编程)知道虚拟文件夹的位置,以便在信息对话框中显示它?

我发现以下问题与我所问的非常接近,但它并没有显示了解文件何时进行虚拟化以及在哪里进行虚拟化的解决方案(如果有的话)。

如何检测文件重定向到Windows VirtualStore?

虚拟化对应用程序是透明的。根据您链接到的问题中的答案(使用带有TokenVirtualizationEnabled标志的GetTokenInformation()),了解它是否正在虚拟化的唯一方法是询问操作系统,但(据我所知)无法询问操作系统虚拟化项目的实际存储位置,因为不同的操作系统版本可能会有所不同。你必须做一些研究,然后为你的应用程序在运行时检测到的每个给定操作系统硬编码路径。

如果要更新代码以检测虚拟化,那么最好更新代码以更好地使用UAC。停止将文件存储在不属于它们的地方,并开始将它们存储在Microsoft希望您存储它们的地方。在这种情况下,改为在用户的配置文件中。使用SHGetFolderPath()或相关功能定位用户的CSIDL_LOCAL_APPDATA文件夹(或Vista+上的SHGetKnownFolderPath()定位FOLDERID_LocalAppData文件夹),然后在其下创建一个子文件夹,供应用程序将其数据文件存储在中。

最新更新