UAC 虚拟化

虚拟化

注意
虚拟化的引入是为了改进 Windows Vista 上以标准用户运行的程序的兼容性。开发人员不应依赖于现在及后续版本 Windows 中存在的虚拟化。

在 Windows Vista 之前,许多应用程序通常是被管理员运行的。结果是,应用程序可以自由地读写系统文件和注册表键。如果标准用户运行这些程序,这些操作会由于权限不足而失 败。Windows Vista 通过重定向对用户配置文件中每个用户的写操作(以及后续的文件或注册表操作)来改进标准用户程序的兼容性。例如,如果一个程序试图写入到 C:\Program Files\Contoso\Settings.ini,但用户没有写入那个目录的权限,这个写操作就会被重定向至 C:\Users\Username\AppData\Local\VirtualStore\Program Files\contoso\settings.ini。对于注册表,如果一个程序试图写入到 HKEY_LOCAL_MACHINE\Software\Contoso\,它会被自动重定向到 HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\Software\Contoso 或者 HKEY_USERS\UserSID_Classes\VirtualStore\Machine\Software\Contoso。

下图详细显示了 Windows Vista 中的虚拟化过程。在这个例子里,Denise 是处于 管理员批准模式中的管理员,而 Brian 是标准用户。虚拟化由两部分构成:文件虚拟化注册表虚拟化

虚拟化过程


注意
当开发 Windows Vista 程序时,为了减少虚拟化文件和注册表的复杂度,确保内嵌一个包含适当 requestedExecutionLevel(请求执行等级)的应用程序清单(manifest) 以关闭文件和注册表虚拟化。

虚拟化在以下情况启用:
  • 32 位交互式程序
  • 管理员才可写入的文件/文件夹和注册表键

虚拟化在以下情况禁用:
  • 64 位程序
  • 非交互式程序
  • 模拟(令牌?)的进程 (Processes that impersonate)
  • 内核模式调用方
  • 带有 requestedExecutionLevel(请求执行等级)的可执行程序


虚拟化与漫游: (漫游:http://baike.baidu.com/view/119296.htm
虚拟化的文件/文件夹和注册表键不漫游
和全局对象有关的不漫游

文件虚拟化

文件虚拟化解决了应用程序需要在仅管理员可写位置存储文件 —— 比如配置文件 —— 的情况。这种情况下以标准用户运行程序可能会由于权限不足导致程序错误。

当应用程序写入到仅管理员可写位置时,Windows 就会将所有后续文件操作写入到 VirtualStore 目录下的指定路径,VirtualStore 目录位于 %LOCALAPPDATA%\VirtualStore。然后,当程序再次读取这个文件时,电脑会提供 VirtualStore 目录里的那一份文件。因为 Windows 安全基础设施可以在没有应用程序协助的情况下完成虚拟化,程序认为它自己成功地直接读写了 Program Files 目录。文件虚拟化的透明使应用程序觉得它们正在读写受保护的资源,然而事实是它们在访问虚拟化的资源。

注意
当你枚举文件夹和注册表中的资源时,Windows Vista 会将这些文件/文件夹和注册表键合并到一个列表中。在这种合并视图中,受保护资源看起来和虚拟化的资源在同一个目录里。

重要
虚拟化的副本总是被优先提供给程序。例如,config.ini 同时在 \PF\App\config.ini 和 %LOCALAPPDATA%\VirtualStore\config.ini 中出现,程序总是会读取到 VirtualStore(后者) 里的文件,就算 \PF\App\config.ini 已经更新了也一样。


虚拟化资源和视图



注册表虚拟化
注册表虚拟化与文件虚拟化类似,但应用于 HKEY_LOCAL_MACHINE\SOFTWARE 下的注册表键。这个功能允许以标准用户运行的,需要在 HKEY_LOCAL_MACHINE\SOFTWARE 中存储信息的程序继续工作。键和数据被重定向至 HKEY_CLASSES_ROOT\VirtualStore\SOFTWARE。和文件虚拟化的情况一样,每个用户有一份程序存储在 HKEY_LOCAL_MACHINE中的值的拷贝。

虚拟化建议
虚拟化只是为了协助已存在的程序改进兼容性。为 Windows Vista 设计的程序不应写入系统敏感区域,也不应依赖虚拟化来纠正错误的程序行为。当更新现有代码以适应 Windows Vista 时,开发人员应确保运行时程序仅在用户个人目录或 %allusersprofile% 这些有合适的访问控制列表(ACL)的地方存储数据。

重要
微软计划当越来越多的程序兼容 Vista 后,在未来版本的 Windows 中移除虚拟化功能。例如,64位程序的虚拟化是停用的。

下面列出其他文件和注册表虚拟化建议:
为你的交互式应用程序添加包含合适 requestedExecutionLevel 的应用程序清单。这会将列入清单的程序的虚拟化关闭。

不要将注册表用作进程间通信机制。服务和用户程序所看到的键是不同的。

在 Windows Vista 上测试你的程序:确保以标准用户运行的程序不会写入全局命名空间例如 %systemroot%。

记住虚拟化资源是全局资源(受保护资源)在每个用户中的一份副本(拷贝)。