【问题标题】:Why do files get placed in "C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)"?为什么文件放在“C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)”中?
【发布时间】:2010-07-10 12:53:00
【问题描述】:

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

这个文件夹区域是做什么用的,文件如何/何时移动到这个区域?我们如何预防它?我现在希望我的应用程序使用.manifest 这不会再次发生。当应用程序被放置在 UAC 虚拟化中时,文件是否在使用清单之前放置​​在那里?

【问题讨论】:

    标签: windows-vista uac


    【解决方案1】:

    未以提升权限运行的应用程序不应访问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 的详细信息已在之前的几个 StackOverflow 问题中得到解决。随意使用搜索框!

    【讨论】:

    • 不是C:\Users\&lt;User Name&gt;\AppData\Roaming\&lt;Manufacturer&gt;\&lt;Product&gt;\&lt;Product Version&gt;吗?我目前不知道背景,但我观察到许多符合现代 Windows 的应用程序使用 Roaming 分支而不是 Local 分支。
    • @Wolf:是的,这可能是一个更好的选择。
    【解决方案2】:

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

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

    【讨论】:

    • 短期修复“使用 requireAdministrator”清单。呃,不,不要!
    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多