深入了解UAC

UAC(User Account Control)即用户帐户控制,是从Windows Vista开始引入的,并在Windows 7中得到了很大的改进一种机制,无论对普通用户还是对开发者都有很大的影响。但是谈到UAC到底是一个怎样的机制,不见得每个人都知道,反而在很大程度上都被误解了。本文就试图阐述UAC的一些原理机制及作用意义。

相信绝大多数人的Windows都只开了一个账户,即管理员账户,在微软曾经的一份调查中显示:Windows只有一个账户的比例高达70%。在Windows XP及其之前的操作系统中,这样会导致进程在启动时即从explorer.exe继承了管理员权限(绝大多数是这样),甚至可以将管理员权限继续传递给其子进程。拥有管理员权限的进程可以修改系统的任何设置,甚至可以修改其他用户的数据,恶意程序也可以因此修改系统的安全设置,比如关闭防火墙,关闭杀毒软件。因此不仅微软,普通用户也希望大多数程序在运行时只拥有普通权限,而并非管理员权限;即使那一小部分程序想要获得管理员权限,那么也是得在征得用户的许可下才可以成功获得。很幸运,UAC正是提供这样功能的一种机制。

从Windows Vista开始,第一个登录Windows的账户是一个PA(Protected Administrator)账户,而在之前版本的Windows中则是一个完全的管理员账户。在PA账户下运行的程序不具备管理员权限,除非对其进行提权。因此在开启UAC的Windows中,应用程序想要获得管理员权限必须征得用户的同意。征得用户同意的方式是将当前屏幕背景保存为快照(没错,的确保存为快照,可以在播放一段视频的时候进行提权,观察视频画面是否继续播放),并将其颜色变暗作为背景,同时创建“安全桌面”,并在其上弹出一个对话框询问是否进行提权, UI效果非常显著,如下图。

1

所谓“安全桌面”是指当前桌面属于操作系统而不是用户,就像登录Windows时的桌面一样;提权即指提升到管理员权限。如果Windows已成功验证程序的签名那么提权对话框会显示很友好的蓝色,如上图,如果程序无签名提权对话框会显示略带警告意思的橙黄色,但并不足以说明程序是具有威胁的。如果用户允许提权则程序才会获得管理员权限,否则程序是取消运行。

前文提到,拥有管理员权限的程序才可以对系统一些目录、设置进行更改,准确地说是全局目录、设置。目录比如%SYSTEMROOT%, %PROGRAMDATA%等,以为系统设置通常保存在注册表中,具有全局作用域的注册表键值比如HKEY_LOCAL_MACHINE\ SoftWare。举个例子,很多程序都想实现开机启动,具体的做法是将启动信息写在注册表HKEY_LOCAL_MACHINE\SoftWare\MicroSoft\Windows\CurrentVersion\Run或者HKEY_CURRENT_USER\SoftWare\MicroSoft\Windows\CurrentVersion\Run两个键的其中一个下。仔细看这两个键非常相似,唯一的不同就是根键,一个是HKEY_LOCAL_MACHINE(HKLM),另一个是HKEY_CURRENT_USER(HKCU)。它们的不同是HKLM中的信息通常是起全局作用的,而HKCU仅对当前用户起作用。如果我们当前用A账户登录Windows,安装程序将启动信息写到了HKLM\SoftWare\……\Run下那么即使下次用B账户登录程序依然会开机启动,但是如果写到HKCU\SoftWare\……\Run下那么这样的配置仅对A用户起作用。因此在注册表中HKEY_LOCAL_MACHINE\SoftWare是属于全局作用域。对此键值及其子键进行更改,程序必须具备管理员权限。可以想象,一个程序想对全局的设置做些手脚,而又不能保证总是能以管理员权限运行是一件很悲剧的事,在UAC的影响下轻则程序设置失败,重则程序崩溃。因此那些对全局的设置进行更改的程序保证能以管理员权限运行是很重要的,因此必须将程序做成拥有一种对用户友好的提权提示的形式。

在我们日常使用Windows中,最常用的无外乎3种提权方法。一种是从右击程序弹出的菜单中选择“以管理员身份运行”,显然这种是不友好的,因为相信大多数用户都是习惯直接双击运行程序,而且很少的一部分有经验的用户知道在程序进行某一些操作失败时应该从这里运行程序;第二种是从程序属性的兼容性选项卡中勾选“以管理员身份运行”,这样程序以后都会以管理员身份运行,当然运行前会依然会弹出提权提示;第三种应该归结为程序自身的设计。之前有人问过为什么有的程序右下角会有一个小盾牌而有的程序则没有。比如下图

2

这个小盾牌表明在当前环境下运行此程序必须获得管理员权限。细心的用户会发现,有盾牌的程序每次运行会自动弹出提权对话框,不需要任何的人为干预,而没有盾牌的则不会弹出提权对话框,因此运行时也不具备管理员权限。那么这个盾牌是如何实现的呢?其实在每个程序中都会嵌入一个清单(manifest),实质上是一个xml文件,内容类似下图。

3

值得注意的是asInvoker这个值,与此类似这个位置可以有三个不同的值,分别是requireAdministrator、highestAvailable 、asInvoker。

requireAdministrator意思为总是需要管理员权限,如果没有获得管理员权限,则程序不会运行。因此这样的程序右下角会有一个小盾牌,出现提权提示时如果点否,则程序不会运行。

highestAvailable意思是尽可能地获得最高权限,如果程序实在管理员账户下运行,则出现提权提示,请求获得管理员权限;如果在普通用户下运行,则以标准权限运行。

asInvoker意思是和调用此程序的进程一样的权限运行(亦父进程)。

说了上面这么多,看上去UAC是一种安全机制,但坦白地说这只是UAC的一个副作用。UAC作为一种账户权限机制背后真正的意义是,能够让用户以标准用户权限使用电脑流畅自如。但这并不是一件容易的事,因为这首先需要开发者将其软件做成只需要标准用户权限运行的形式。在UAC的影响下,其实向开发者传递了这样一个信息:你们的程序并不会被保证总是会以管理员权限来运行,是以标准用户权限来完成原本没必要使用管理员权限完成的事,还是继续弹提权对话框来打扰用户,哪个更友好,你们自己看着办吧。

参考资料

Mark Russinovich.《Inside Windows 7 User Account Control》

Jeffrey Richter.《Windows核心编程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值