我最近更新了我的Visual Basic 6.0应用程序,现在包含一个exe.manifest文件以防止UAC虚拟化。应用此更新后,某些用户无法找到他们的数据文件(Access MDB文件),在系统搜索后,他们最终会在C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)
中找到它。
此文件夹区域是什么以及文件如何/何时移动到此区域?我们如何防止它?我希望现在我的应用程序使用.manifest
这不会再发生。在将应用程序放置在UAC虚拟化中之前,是否将文件放在那里?
答案 0 :(得分:35)
未使用提升权限运行的应用程序应该无法访问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\
必须在运行时动态查找路径。使用
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的详细信息已在以前的几个Stack Overflow问题中得到解决。随意使用搜索框!
答案 1 :(得分:7)
我的猜测是你的清单是asInvoker,你的应用程序试图写入Program Files。当用户在没有清单的情况下运行它时,它会向虚拟存储区写入Program Files,这是他们稍后找到某些文件的路径。当他们使用清单运行时,它根本无法写入(访问被拒绝),但是您的应用程序隐藏了错误,或者他们不理解错误,因此他们没有向您提及。
短期修复 - 使用requireAdministrator清单。这会激怒用户,但写入会成功。长期修复 - 不要写入ProgramFiles。有更好的每用户选项,如AppData。