2011-03-15 562 views
2

我们终于开始将软件的文档从程序自己的目录中移出到“我的文档”中。我们还在清单中添加了“requestedPrivileges”行,以防止虚拟化带来进一步的麻烦。禁用UAC虚拟化后恢复文件

但是,如果我们只这样做了,那么在Vista/7中运行旧版本的任何人在更新后可能会在隐藏的VirtualStore目录中的某处丢失其工作。那么迁入21世纪的首选方式是什么?

坦率地说,我对复制文件有点谨慎,特别是因为我似乎无法找到在影子目录中获得的程序化方式,但大概其他许多人必须在我们面前遇到同样的问题。

回答

2

除非您合法需要管理权限才能使您的程序正常工作,否则请不要添加requestedPrivileges - 您的描述中没有任何内容表明您已这样做。 应该也可以让你简单地复制第一次启动时的文件,就好像它们仍然在你的程序目录中一样,因为任何虚拟化仍然有效。

但是,如果您绝对必须在未启用UAC的情况下执行迁移,则可以在%LOCALAPPDATA%\VirtualStore\path\to\file中找到您的文件。例如,如果您的文件已存储在C:\ Program Files \ OurApp \中,您可以在%LOCALAPPDATA%\VirtualStore\Program Files\OurApp\中找到它。

要获得到%LOCALAPPDATA%的路径,可以使用SHGetSpecialFolderPathCSIDL_LOCAL_APPDATA作为CSIDL参数。

+0

不,我们不需要任何额外的特权,所以我们使用asInvoked级别。这只是我们在虚拟化方面遇到了一些问题(例如用户通过资源管理器备份旧数据),并希望在将来避免它们。这就是我们为什么要改变事物的原因。 我想一个存根可执行文件做复制也应该做的伎俩,尽管如此。 – doynax 2011-03-15 16:09:43

+0

@doynax:通过需要更多权限,您只会激怒离开UAC的用户,并且现在不得不接受在他们启动程序时为您的程序提供管理权限 - 这只是在机器上担任管理员角色的用户;对于通常在有限帐户下运行的用户,他们每次都必须输入管理员密码。充其量,增加特权将是一种解决方法,而不是修复;要解决这个问题,你必须移动所有的东西,一旦你这样做了,你就不需要这些权限。 – 2011-03-15 16:21:48

+0

我正在请求“asInvoked”级别,根据MSDN标准,这是正确的方式,表示您的应用程序支持Vista(并因此关闭虚拟化),而不需要任何额外的权限。 – doynax 2011-03-15 16:52:39