如何禁用VirtualStore以针对C++程序?

7
我希望我的程序在尝试创建受保护位置的文件时,比如 C 盘根目录 (例如:FILE* FileHandle = fopen("\\file.txt", a)) 会抛出错误。但实际上,该文件将被创建在 %APPDATA% 的虚拟存储中。请问如何禁用虚拟存储呢?谢谢。
备注:为了明确,我并不是在询问如何绕过安全限制,在受保护的位置创建文件。我想让文件创建失败,这样我可以告诉用户他犯了一个错误。

@BenVoigt 感谢提醒。我已经很久没有看过这个问题了。 - Zain Rizvi
3个回答

17

你需要添加一个应用程序清单。选择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>

是的,带有<trustInfo/>部分的清单将执行进程标记为“Vista感知”而不是“传统的”。 - Bob77
我已经在我的清单文件中添加了trustInfo部分。现在该进程不会写入VirtualStore。但是,该进程仍然尝试从VirtualStore读取:(是否有一种方法也可以禁用它? - ZhekaKozlov
灵光一闪!这很可能是我们无法追踪的UAC错误的最有可能的来源。不幸的是,我必须更改清单的程序不是我们自己的,所以它永远不会起作用。 - Joshua

7

来自MSDN

虚拟化只适用于:

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

虚拟化被禁用于:

  • 64位进程
  • 非交互型进程
  • 冒充者进程
  • 内核模式调用者
  • 具有requestedExecutionLevel的可执行文件

正如Adam Maras所指出的,最好的方法是通过添加清单来设置应用程序的requestedExecutionLevel。请求"asInvoker" 的requestedExecutionLevel 将导致在受保护位置上失败的文件操作,而不是重定向到虚拟存储或提示提升。


4
这是一篇介绍如何关闭虚拟化的文章。

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

简而言之:

-从Windows 7开始按钮开始搜索本地安全策略并选择它。

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


为什么要关闭“UAC”?还记得Windows Vista以外的Redmond,WA地区如何接受它吗?从历史上看,UAC是Vista的死亡之路!所以我的问题是,为什么要在操作系统的后续版本中重新启用这个垃圾? - Mark Ronollo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接