为什么文件放在"C:\ Users\<用户名> AppData\Local\VirtualStore\Program Files(x86)"中?

Nea*_*eal 35 uac windows-vista

我最近更新了我的Visual Basic 6.0应用程序,现在包含一个exe.manifest文件以防止UAC虚拟化.应用此更新后,某些用户无法找到他们的数据文件(访问 MDB文件),并在系统搜索后最终找到它C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86).

该文件夹区域是什么以及文件如何/何时移动到此区域?我们如何防止它?我希望现在我的应用程序使用了.manifest这种情况不会再发生了.在将应用程序放置在UAC虚拟化中之前,是否在使用清单之前将文件放在那里?

And*_*and 37

未以提升的权限运行的应用程序应该无权访问Program FilesProgram Files (x86)目录.这有利于安全.此外,在大多数情况下,当开发人员告诉他的程序将数据保存在Program Files文件夹中时,例如程序设置时,他完全忘记了程序设置应该是每个用户的事情!也就是说,本地计算机上的每个用户都应该能够使用该程序而不会影响其他用户.换句话说,一个表现良好的应用程序应该将其设置保存在

C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version> 
Run Code Online (Sandbox Code Playgroud)

目录.

例如,我的AlgoSim软件写入

C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0
Run Code Online (Sandbox Code Playgroud)

当然,

C:\Users\<User Name>\AppData\Local\
Run Code Online (Sandbox Code Playgroud)

必须在运行时动态查找路径.使用

SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
Run Code Online (Sandbox Code Playgroud)

为了这.

从Windows Vista开始,未尝试写入Program Files(或Program Files (x86))文件夹的高级权限运行的应用程序实际上会在不知不觉中写入VirtualStore文件夹.微软认为这比程序失败(由访问限制引起)更好.事实上,多亏了这一点,大多数保存Program Files文件夹中设置的旧程序将继续使用Windows Vista +,并且每个用户都将获得自己的设置作为奖励,即使原始软件制造商没有想到这一点.

您可以使用清单告诉Windows您的应用程序知道VirtualStore,并且Windows在运行时不应更改任何路径.但是如果你真的希望能够写入该Program Files文件夹,那么我认为你必须每次都使用提升的权限运行应用程序,这通常是不可取的.

有关如何创建清单以使程序在每次执行时显示UAC提示以及如何禁用VirtualStore的详细信息已在以前的几个Stack Overflow问题中得到解决.随意使用搜索框!


Kat*_*ory 8

我的猜测是你的清单说asInvoker,你的应用程序试图写入Program Files.当用户在没有清单的情况下运行它时,它会向虚拟存储区写入Program Files,这是他们稍后找到某些文件的路径.当他们使用清单运行时,它根本无法写入(访问被拒绝),但是您的应用程序隐藏了它们的错误,或者他们不理解错误,因此他们没有向您提及.

短期修复 - 使用requireAdministrator清单.这会激怒用户,但写入会成功.长期修复 - 不要写入ProgramFiles.有更好的每用户选项,如AppData.

  • 短期修复"使用requireAdministrator"清单.呃,不,不! (3认同)