如何获取(以编程方式)Windows UAC虚拟化文件的位置?

时间:2013-07-30 17:22:42

标签: winapi windows-vista uac data-virtualization

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

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

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

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

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

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

  3. 我发现以下问题与我提出的问题非常接近,但它没有显示解决方案(如果有的话)知道何时为文件进行虚拟化,以及虚拟化的位置。

    How to detect file redirection to the Windows VirtualStore?

1 个答案:

答案 0 :(得分:3)

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

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