首页 > Windows开发 > 用户帐户管理数据重定向(UAC虚拟化)

用户帐户管理数据重定向(UAC虚拟化)

在前面一篇文章《仙剑奇侠传三存档修改器去广告版》中提到玩仙剑三的时候存档文件被重定向了,后来查了下是所谓的“UAC虚拟化”技术,用了这么久的Windows 7,才知道有这个东西。下面这篇文章是微软的白皮书。

数据重定向:写入受保护的资源

介绍
很多应用程序都设计为把文件写入Program Files,Windows目录,或者系统根(一般是C盘)文件夹。一些应用程序被设计为更新Microsoft Windows 注册表的值,特别是HKLM/Software中的值。但是这样会有存在一个问题:文件或注册表的值并没有被创建或更新。您可能会问,“怎么回事?我的应用程序运行良好并没有报错啊。我的文件到底去哪儿了?”

您可能遇到过下面的一种或多种情况:

  • 您的应用程序写入Program Files,Windows目录,或者系统根(一般是C盘)文件夹,但是您在这些地方并没有找到您的文件
  • 您的应用程序写入Windows注册表,特别是HKLM/Software中,但是您没有看到注册表进行了更新
  • 您切换到了另一个帐户,并且您的应用程序没有办法找到已写入Program Files,Windows目录,或者系统根(一般是C盘)文件夹的文件,或者找到了这些文件的老版本
  • 在启用或禁用用户帐户控制(UAC)后,您的应用程序都没有办法找到Program Files或Windows目录中的文件

如果这些出现在了您的应用程序中,都是由于UAC虚拟化的原因。下面所提供的信息为您介绍了所有关于发现这个应用程序兼容性问题,解决方案,以及特殊兼容性问题的一些附加信息。

真正的问题:UAC 虚拟化

在Windows Vista中,一般由管理员来运行应用程序。这样,应用程序可以自由的读写系统文件和注册表的值。如果标准用户可以运行这些应用程序,那他们可能会由于没有足够的权限而导致失败。Windows Vista通过重定向写入(以及后续文件或者注册表操作)对应用户的配置文件(profile)位置,来对标准用户运行应用程序的能力进行了提升。

例如,如果一个应用程序试图写入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 虚拟化进程的两个组件:文件虚拟化和注册表虚拟化
Windows 虚拟化进程的两个组件:文件虚拟化和注册表虚拟化
重要注意
当为Windows Vista开发应用程序时,请确定在对应的requestedExecutionLevel元素中嵌入应用程序清单文件。这将会关闭文件和注册表虚拟化,减少虚拟化的文件和注册表值的复杂性。

更多关于UAC虚拟化和新UAC技术,请参阅“Windows Vista中的新UAC技术”http://msdn.microsoft.com/en-us/library/bb756960.aspx

解决方案
虚拟化是为了帮助现存的应用程序解决兼容性问题而出现的。为Windows 7而设计的新的应用程序不应该对敏感的系统区域进行写入操作,不应该依靠虚拟化来对不正确的应用程序行为进行修正。开发应用程序的时候,应该始终考虑使其运行在标准用户的权限下,而不是在管理员权限下运行。测试您的应用程序时,也要用标准用户权限而不是管理员权限。

更多描述请参见原文:http://msdn.microsoft.com/zh-cn/library/ee532451.aspx


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 用户帐户管理数据重定向(UAC虚拟化)
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2012年2月14日16:14 | #1

    呵,你研究的还挺深入哦~

    [回复]

    代码疯子 回复:

    @winson(代码部落), 了解了解,有时候这样的问题很烦人

    [回复]

  2. Drizzt
    2012年2月17日23:44 | #2

    学习了,这个虚拟技术对于软件开发者很方便,为什么msdn说在以后的版本要取消这个功能呢?
    Virtualization is intended only to assist in application compatibility with existing programs.这里说的兼容性是什么意思?我理解是过去的软件通常都会对系统关键部位进行写操作,所以往往在普通用户的权限下面不能正常运行。windows vista的虚拟技术就是为了兼容这样的程序,使他们能够正常运行。
    后面说到:Microsoft intends to remove virtualization from future versions of the Windows operating system as more applications are migrated to Windows Vista.这个让我很迷惑,难道在从XP到vista这几年中,windows的程序员已经发生了很大的变化,开始很关注系统安全,不在对某些关键地位进行写操作?
    既然搞了虚拟,后面又取消了,实在很不明白是为什么。请指教。 [em018]

    [回复]

    代码疯子 回复:

    @Drizzt, 这个我倒也不是很明白。不过我在写代码的时候,如果一般要操作关键部位的程序我都会要求以管理员权限运行。
    看介绍UAC虚拟话是为了兼容旧程序。

    [回复]