我最近更新了我的Visual Basic 6.0应用程序,现在添加了一个exe.manifest文件来阻止UAC虚拟化。在应用此更新后,一些用户无法找到他们的数据文件(Access MDB文件),在系统搜索后,他们最终在C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)
中找到了它。
此文件夹区域用于什么以及如何/何时将文件移动到此区域?我们该如何预防呢?我希望现在我的应用程序使用了.manifest
,这种情况不会再发生了。在UAC虚拟化中放置应用程序时,是否在使用清单之前将文件放置在那里?
发布于 2010-07-11 10:11:32
我的猜测是您的清单显示为asInvoker,并且您的应用程序试图写入程序文件。当用户在没有清单的情况下运行它时,它会写入Program Files的虚拟存储,这是他们后来发现一些文件的路径。当他们使用清单运行时,它根本无法写入(由于访问被拒绝),但要么是你的应用程序对他们隐藏了错误,要么是他们不理解错误,所以他们没有向你提及。
短期修复-使用requireAdministrator清单。这会激怒用户,但写入会成功。长期修复--不要写给ProgramFiles。有更好的针对每个用户的选项,比如AppData。
发布于 2010-07-10 20:58:29
未使用提升的权限运行的应用程序不应具有访问Program Files
和Program Files (x86)
目录的权限。这对安全性是有好处的。此外,在大多数情况下,当开发人员告诉他的程序将数据保存在Program Files
文件夹中时,例如程序设置,他已经完全忘记了程序设置应该是每个用户的事情!也就是说,本地计算机上的每个用户都应该能够使用该程序,而不会影响其他用户。换句话说,行为良好的应用程序应该将其设置保存在
C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version>
目录。
例如,我的AlgoSim软件写入
C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0
当然,
C:\Users\<User Name>\AppData\Local\
path必须在运行时动态查找。使用
SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
为了这个。
从Windows Vista开始,试图写入Program Files
(或Program Files (x86)
)文件夹的非提升权限运行的应用程序实际上会在不知不觉中写入VirtualStore文件夹。微软认为这比程序失败(由访问限制引起)要好。事实上,多亏了这一点,大多数将设置保存在Program Files
文件夹中的旧程序将继续在Windows Vista+上运行,每个用户都将获得自己的设置作为奖励,尽管最初的软件制造商没有考虑到这一点。
您可以使用清单来告诉Windows,您的应用程序知道VirtualStore,并且Windows在运行时不应更改任何路径。但是如果您真的希望能够写入Program Files
文件夹,那么我认为您必须每次都以提升的权限运行应用程序,这在一般情况下是不可取的。
有关如何创建清单以使您的程序在每次执行时显示UAC提示以及如何禁用VirtualStore的详细信息,已在之前的几个堆栈溢出问题中得到解决。欢迎使用搜索框!
https://stackoverflow.com/questions/3219255
复制相似问题