Vista/Win7/Windows Server 2008,加入了UAC功能,这就给开发带来了很多问题,总结了一下碰到的问题和解决办法。
1)权限提升之前,即使是管理员权限帐号(built-in Administrator除外)登陆,也不能向根目录,C:/windows, C:/program files等目录下写文件。
还有也不能访问其他用户的私有文件夹,比如其他用户的Desktop文件夹等,原因是在没有提升权限之前,当前进程仍然只持有普通用户权限的access token,只有提升权限之后,才真正具有管理员权限的token.
2)有时候执行一个安装程序,UAC的权限提升询问对话框(就是屏幕变暗那个)就会弹出来,Windows怎么知道这个程序需要权限提升才能执行呢?
a) 编译的时候加入manifest:<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
反过来,如果不希望提升,就指定为level="asInvoker"。下面会谈到,某些时候Windows也会误认为你的程序需要提升权限,本来是不需要。
但是这样有可能在WindowXP SP2造成程序崩溃的问题。
产生这个问题,目前已知的原因:手动编辑 manifest 文件导致的;使用 Visual Studio 2005 自动产生 manifest 文件导致的。
解决办法:http://support.microsoft.com/kb/921337/en-us
b) 如果不包含manifest文件,或者没有指定requestedExecutionLevel,那么将会启用文件/注册表虚拟机制。
Windows使用虚拟机制来帮助保护文件和注册表。传统的windows程序经常会在系统目录或者HKEY_LOCAL_MACHINE\SOFTWARE注册表项下写文件,但是vista之后,这些系统目录或者注册表项默认是受到保护的,普通权限的用户并没有修改权限。为了兼容这些所谓的遗留(legacy application)的windows程序,不至于在vista/win7上这些程序不能使用,vista之后才用虚拟机制来重定向这些文件/注册表项目到用户目录/注册表项。
-(%programfiles%, %ProgramData%, %SystemRoot%) 重定向到 C:\Users\User_name\AppData\Local\VirtualStore\Program Files\Application_name
-HKEY_LOCAL_MACHINE\SOFTWARE重定向到HKEY_CURRENT_USER\Software\Classes\VirtualStore
File and registry virtualization helps users who have restricted access to the registry and to the file system write to these protected areas. Virtualization creates a "per user" copy and then redirects successive data operations. For example, assume that an application is running under a Lim