【问题标题】:How to disable VirtualStore for C++ programs?如何为 C++ 程序禁用 VirtualStore?
【发布时间】:2011-01-18 23:01:28
【问题描述】:

我希望我的程序在尝试在 C:\ 驱动器的根目录(例如:FILE* FileHandle = fopen("\\file.txt", a))等受保护位置创建文件时抛出错误。而是在虚拟存储中的 %APPDATA% 下创建文件。

如何禁用该虚拟商店?

谢谢

编辑:为了清楚起见,我不是在问如何绕过安全性并在受保护的位置创建我的文件。我希望文件创建失败,以便我可以告诉用户他是个白痴。

【问题讨论】:

  • @BenVoigt 感谢您的提醒。我好久没看过这个问题了

标签: c++ windows file-io fopen virtualstore


【解决方案1】:

您添加一个应用程序清单。选择 asInvoker、highestAvailable 或 requireAdministrator。听起来你想要 asInvoker。

来自http://msdn.microsoft.com/en-us/library/bb756929.aspx

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="IsUserAdmin"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

【讨论】:

  • 是的,带有&lt;trustInfo/&gt; 部分的清单将执行过程标记为“Vista 感知”而不是“旧版”。
  • 我已将 trustInfo 部分添加到我的清单文件中。现在该进程不会写入 VirtualStore。但是,该进程仍会尝试从 VirtualStore 中读取:( 有没有办法也禁用它?
  • 灯泡!我们永远无法追查到 UAC 错误的最可能来源。不幸的是,我必须更改清单的程序不是我们的,所以它永远不会工作。
【解决方案2】:

来自MSDN

虚拟化仅适用于:

  • 32 位交互进程
  • 管理员可写文件/文件夹 和注册表项

虚拟化被禁用:

  • 64 位进程
  • 非交互式进程
  • 模拟的进程
  • 内核模式调用者
  • 具有请求执行级别的可执行文件

正如 Adam Maras 所说,您最好的选择是通过添加清单在您的应用程序上设置 requestedExecutionLevel。 “asInvoker”的 requestedExecutionLevel 将导致文件操作在受保护位置上失败,而不是重定向到虚拟存储或提示提升。

【讨论】:

    【解决方案3】:

    这是一篇展示如何关闭虚拟化的文章。

    http://www.interworks.com/blogs/dsmith/2011/09/21/disabling-windows-7-virtual-store

    简称:

    -从 Windows 7 Start Orb,搜索本地安全策略并选择它。

    -展开本地策略并单击安全选项。在右侧窗格中,一直滚动到底部,您会发现一个名为“用户帐户控制:虚拟化文件和注册表写入失败到每个用户位置”的设置,双击该设置并将其更改为已禁用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多