打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【ITECN技术专栏】之 Windows Vista的UAC功能浅析- Vista...
原文摘自ITECN Blog,作者:盆盆<Microsoft MVP>
原文地址: 点击查看
ITECN Blog是由近40位微软MVP和MCT、还有微软员工组成,旨在宣传微软IT Pro技术

本文以Windows Vista Build 5231为例,就“Date and Time”控制面板组件,在consent前后的进程访问令牌的变化,来试图探秘UAC功能的精妙之处。文章不但描述standard user和Full Privilege User之间的访问令牌的差异,同时揭示了这种差异应用到本例的实质(SeSystemTimePrivilege特权)。最后,文章还尝试解释Windows Vista最新引入的两个SID(Medium Mandatory Level和High Mandatory Level)的作用。

为了让读者诸公更好地享用后面的“正餐”,这里先呈上“开胃酒”─简单介绍一下UAC的功能。UAC(用户帐户控制)可以说是采用逆向思维的典范:

传统的安全规则告诫用户必须工作在受限帐户下,大多数用户会困惑于为什么无法安装应用程序,为什么无法修改系统时间─并没有必然的理由要求用户花时间学习runas的用法,他们有权专注于本职工作,而不是和这些令人生厌的命令打交道。

而UAC则是鼓励用户工作在管理员帐户下,只是这个管理员帐户经过特殊的“降级”处理─多数情况下,用户并不会有掣肘之感。如果要运行需要高特权的管理任务,系统会自动侦测到这种请求,在得到用户确认后,会自动提升到高级特权环境,以便顺利完成管理任务。

大家知道,要用“日期和时间”组件修改系统日期或者时间,当前帐户必须具备“更改系统时间”特权(该特权的内部名称为SeSystemTimePrivilege)。本文以“日期和时间”组件为例进行实验,查看其进程访问令牌的前后变化(主要是SeSystemTimePrivilege特权的变化),来简单剖析UAP功能的实质。

实验约定

本实验在Windows Vista Build 5231上进行,测试帐户为TestAdmin,是管理员组成员。为了查看进程的访问令牌,需要借助聪明人Mark所提供的Process Explorer工具(这个工具实在太好了,我们经常用它来查看IE浏览器所加载的dll文件,以便进行排错─且按下不表),下载地址如下:
http://www.sysinternals.com/Utilities/ProcessExplorer.html

实验记录

1.准备工作

鼠标右键单击Process Explorer程序图标,然后执行“Run Elevated”菜单命令,以便在完全权限下运行Process Explorer,这样我们就可以不受限制地查看任意进程的访问令牌。启动以后,单击Options→Difference Highlight Duration,设置变化时间为5秒。

2.查看rundll32进程的访问令牌

单击任务栏通知区域的时钟图标,然后单击“Date and Time Settings”,即可打开“时间和日期”窗口。正如您所预料的,现在还不能对系统时间进行任何修改。同时可以在Process Explorer窗口中看到新增一个进程rundll32(绿色显示),如下图所示。


双击该rundll32进程,即可打开其属性对话框。在“Image”标签页的“Command Line”文本框里可以看到timedate.cpl(“时间和日期”的控制面板扩展文件),如下图所示。这说明该rundll32进程就是“时间和日期”组件的宿主进程。


切换到“Security”标签页里,就可以看到经过特殊降级处理后的访问令牌,可以看到在下方的特权列表里,只有少得可怜的三个特权,而并没有SeSystemTimePrivilege特权!这就是为什么在缺省情况下,无法在TestAdmin环境下修改系统时间的原因。而在老的系统例如Windows XP,rundll32进程具有SeSystemTimePrivilege特权,如下图所示。


3.查看dllhost进程的访问令牌

要能够修改系统时间,只需单击“时间和日期”窗口右下侧的“Unlock”按钮,即可打开如下图所示的对话框,同时可以看到系统启动了一个consent进程。单击“I want to complete this action”选项,现在应该可以修改系统时间了。看来这个consent进程负责传递消息,以便系统确认提升操作权限。其本质应该是修改相关进程的访问令牌,对于本例来说,应该是在相关进程的安全令牌里添加SeSystemTimePrivilege特权。


按照这样的推断,从理论上来说,现在rundll32进程的访问令牌里应该已经添加SeSystemTimePrivilege特权,以便我们可以修改系统时间,那么果真是这样吗?

结果很让人沮丧,重新打开rundll32进程的属性对话框,发现其访问令牌没有任何改变(并没有新增SeSystemTimePrivilege特权)!这是怎么回事?

反复重新做实验后,终于发现,单击“I want to complete this action”选项后,系统会新增一个dllhost进程(在Process Explorer中绿色显示),在dllhost进程属性对话框的“Image”标签页的“Command Line”文本框里可以看到“/Processid: {9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}”参数。搜索注册表得知,{9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}就是timedate.cpl的AppID,如下图所示。


接下来的步骤不说也知道,切换到“Security”标签页,不出所料,dllhost进程的访问令牌里果然有SeSystemTimePrivilege特权,如下图所示。


现在真相大白了,原来Windows Vista表面上让rundll32进程“明修栈道”,背地里却让dllhost进程“暗渡陈仓”,真正让我们可以修改系统时间的是dllhost进程!

4.比较前后访问令牌的SID列表

仔细观察前后两个进程(rundll32进程和dllhost进程)访问令牌中的SID列表,会发现有以下两个显著的不同:

(1) rundll32进程:Administrators组SID被标记为Deny only,其含义类似于Windows XP/2003中Restricted Token。这表明Administrators组可以访问的资源,和我们无关,而Administrators拒绝访问的资源,我们也不能访问。

访问令牌里包含一个名为“Medium Mandatory Level”的古怪帐户(SID为S-1-16-8192)。

(2)dllhost进程:包含一个名为“High Mandatory Level”的“古怪”帐户(SID为S-1-16-12288)。

实验结论

1.UAP的实质

非Administrator的管理员登录时,Explorer进程会获得一个“缩水”的访问令牌,也叫标准用户(Standard User)访问令牌。由于其他进程大多数都是由Explorer启动,所以这些进程会自动拷贝这份“缩水”的访问令牌(如本例的rundll32进程)。凭借这份“缩水”的访问令牌,用户可以完成绝大多数工作,如果需要执行管理任务,系统会提醒用户进行确认,一旦认可,将会获得完全版本的访问令牌(如本例的dllhost进程)。

进一步验证发现,本例的rundll32进程由explorer进程启动,所以默认会获得一份“缩水”令牌;而dllhost进程则由某个svchost进程启动。

2.古怪帐户的作用猜测

至于前后两个进程的访问令牌中新出现的“古怪”帐户(一个是“Medium Mandatory Level”,另一个是“High Mandatory Level”)。这两个帐户,既不能用来登录,似乎也不能用来对资源的ACL赋值,到底用来做什么?

个人的猜测是用来标记访问令牌,这样系统看到访问令牌中包含SID为S-1-16-8192的帐户(Medium Mandatory Level),马上就可以知道该令牌属于标准用户令牌;同样如果令牌中包含SID为S-1-16-12288的帐户(High Mandatory Level),马上就知道其属于完全权限的令牌。

那么为什么不在访问令牌中新增一个标志位,例如等于0时就是标准用户令牌,等于1时就是完全权限令牌?个人猜测是为了兼容性,毕竟增加一个标志位,就等于要修改访问令牌的数据结构,这可不是一个好主意,而添加几个SID,则相对简单得多。

3.有趣的任务管理器

在实验中,还发现,如果右键单击任务栏空白区域,打开任务管理器(其父进程是Explorer),则任务管理器运行在标准用户的访问令牌下;而按下Ctrl+Shift+Esc组合键打开的任务管理器(其父进程是Winlogon),则运行在完全权限的访问令牌下。

最后小结

UAP好比给Windows Vista穿上一件铁布衫,有了它的庇护,像IE这样的进程不再奉行“不抵抗”政策,恶意网页胆敢再来“骚扰”,将被毫不犹豫地阻止。同时最终用户不再需要接受额外的培训,一切都由系统自动完成,只需要做出选择即可,你就没事偷着乐吧!


提示

1.有关UAC的官方资料,请参考Windows Vista开发组工程师Chen Yu先生的帖子:

http://blogs.itecn.net/blogs/yuchen/archive/2005/10/19/994.aspx

2. 有关SeSystemTimePrivilege特权的相关内容,参考了微软知识库文章编号KB 300022和《Windows Internals 4Edition》(Chapter 8 Security)中的相关内容。有兴趣的朋友可以阅读这些资料了解相关背景知识。

3. 有关帐户特权的更详细信息,可以参考以下微软官方网页(Windows XP Resource Kit):

http://www.microsoft.com/resourc ... s/prnd_urs_mhnn.asp
 
 
【ITECN技术专栏】之 Windows Vista的UAC功能浅析(二)

原文摘自ITECN Blog,作者:盆盆<Microsoft MVP>
原文地址: 点击查看
ITECN Blog是由近40位微软MVP和MCT、还有微软员工组成,旨在宣传微软IT Pro技术

命令行程序的权限提升

看过《关闭计算机中恼人的beep噪音》一文的朋友,在对Windows Vista进行操作的时候需要格外注意!
由于Windows Vista默认启用UAC功能,CMD Shell以Standard User的身份启动,我们无法采用sc命令对beep服务进行配置(会收到Access is Denied的错误消息)。
这时候必须右键单击开始菜单上的“Command Prompt”,选择“Run as administrator”,以Highest Privilege运行CMD Shell,这样SC命令才能拿到足够特权完成相应的管理工作。如下图所示,淡青底色的CMD Shell以Standard User身份运行(结果SC命令运行失败),而红底色的CMD Shell则以Highest Privilege运行(结果SC命令运行成功)。


提示 有关Windows Vista中CMD Shell的UAC功能“失灵”的另一个实例,可以参考MVP Smallfrog的帖子:
http://blogs.itecn.net/blogs/sma ... 006/02/26/1832.aspx

UAC的两大要素

那么,为什么说在当前CTP Build的Windows Vista中,CMD Shell的UAC功能是“失灵”的?
窃以为,真正意义上的UAC,必须至少同时满足以下两个条件:
? 用户进程运行standard user安全环境下,这点CMD Shell可以做到。
? 当系统"识别"出目标进程需要高级特权才能完成,就会自动弹出提升特权确认对话框(consent进程),得到确认后,会以最高特权运行目标进程。
只有自动识别、自动提升特权,才能算是UAC的精髓!
否则在Windows XP一样可以让用户进程运行在Standard User环境(可以参考笔者的《IE浏览器,我想你安全、再安全些》),但是这充其量只能算是LUA(最小帐户特权),而不够格称为UAC(用户帐户控制)!

修改UAC兼容性设置

能不能修改SC命令的兼容性设置,让系统知道它需要管理员权限?
但是打开SC命令的属性对话框,发现其兼容性设置被锁死,如下图所示,原因是SC命令属于系统内置的组件,这和Windows XP的情况一样。


这里尝试修改注册表,试图绕过这个限制,把SC命令添加到系统的兼容性数据库中:
(1) 打开regedit注册表编辑器,定位到以下注册表项:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
(2) 新增一个字符串键值:
名称必须设置为“C:\Windows\system32\sc.exe”
并将其数值数据设置为“RUNASADMIN”
提示 该注册表修改完全等效于如图2所示的兼容性设置,只是绕开了UI的限制。

现在打开一个Standard User的CMD Shell,再尝试运行SC命令,系统也会弹出consent确认对话框,如下图所示。


确认后系统会自动打开一个新的CMD窗口运行SC命令,只是该窗口会一闪而过,让人来不及反应,但是SC命令确实是在高特权下运行的。
显然上述的注册表修改法并不是解决问题的良药,实际上这只是强行把“皮球”踢给Explorer Shell(GUI)罢了,执行的结果也并不理想,更何况数百个命令行工具,逐个修改的话,简直是一场噩梦!

Windows Vista区别对待不同的进程

同样是系统内置的组件,例如regedit、mmc等GUI组件,其兼容性设置也被锁死,但是为什么系统会主动询问是否提升权限?难道命令行工具是后妈养的,Windows Vista有意给它穿小鞋?
用记事本(或者其他编辑器)打开分别打开regedit.exe和sc.exe,进行仔细对比查看,发现了秘密所在:
regedit.exe和SC.exe的内容分别如下图所示。




从图中可以看出:

QUOTE:
在SC.exe中有如下xml格式的语句:
level="asInvoker"
regedit.exe中有如下xml格式的语句:
level="highestAvailable"
原来UAC有一种机制,可以由应用程序的manifest(程序清单)来指定该应用程序的运行级别,可以在manifest中指定以下三种级别:
? asInvoker:继承父进程的访问令牌,这就是为什么SC.exe默认运行在standard User环境下,因为继承了CMD Shell的访问令牌。
? highestAvailable:进程可以获得它所能得到的最高级别的访问令牌。
? requireAdministrator:进程必须由管理员组成员启动,并且必须获得完全级别的访问令牌。

唯一遗憾的是,只能由Microsoft自己对SC.exe的manifest信息进行修改,如果企图借助Winhex等工具直接修改SC.exe中的Manifest信息(例如试图将其RunLevel修改为"highestAvailable"),结果就会闹和笔者一样的笑话,收到“side by side”的出错消息──都是不懂开发给整的~

这里多说一句:如果病毒等恶意程序,也利用manifest信息在其代码里添加特权标记,会不会误导最终用户?
应该不会:
从Build 5308开始,Windows Vista会自动检查程序代码中的数字签名,并且在consent对话框里提供相应的警告信息。如果试图运行一个没有合法签名的程序,Windows Vista会警告说该程序没有合法的“身份证”,若要运行,后果自负。
要了解更多的有关manifest的信息,可以参考以下的微软官方文档:
http://msdn.microsoft.com/librar ... html/AccProtWindows Vista.asp

实验查验Mandatory Label SID的作用

当系统尝试启动标记为高特权的进程时,Windows Vista并非不分青红皂白,一味地弹出consent对话框要求确认。
其实这个问题在笔者的拙作《Windows Vista的UAC功能浅析(一)》中曾经提到过Windows Vista新引入了几个“古怪的SID(在本文,这些SID统称为Mandatory Label SID):
? Medium Mandatory Level:其SID为S-1-16-8192。
? High Mandatory Level:其SID为S-1-16-12288
? System Mandatory Level:其SID为S-1-16-16384
? Low Mandatory Level:该标志主要用于保护模式的IE浏览器等进程
这三个“古怪”帐户SID,实际上就是专门用来标记访问令牌的,这些帐户既不能用于登录,也不能用于安全权限分配。
笔者在Windows Vista CTP 5308虚拟机上,分别做以下三个实验:
(1) 直接运行regedit,会弹出consent对话框确认提升权限,这时候的父进程为explorer.exe,其Mandatory Label SID为“Medium Mandatory Level”。
(2) 以“Run as administrator”方式打开一个CMD Shell,这时候CMD进程的Mandatory Label SID为“High Mandatory Level”,在其下可以打开regedit,而无需确认。
(3) 按下ctrl+alt+del组合键,在Winlogon Desktop上单击“Start Task Manager”按钮,即可弹出如下图所示的窗口,实际上就是一个taskmgr.exe进程,其Mandatory Label SID为“Medium Mandatory Level”,这里在Process Explorer里记下其PID(假设为2272):


在该窗口上单击“All programs on this computer”按钮,即可弹出一个consent对话框要求确认权限的提升。确认后即可弹出任务管理器,这时候原来的taskmgr进程(PID为2272)就会被自动杀死,现在我们在Process Explorer里打开新启动的taskmgr进程的属性对话框,可以看到其父进程就是那个已经被杀死的PID为2272的进程!如下图所示。难怪需要确认是否提升权限。


根据实验结果,我们可以得出以下的结论:
当我们尝试启动某个标记为需要高特权的进程时,Windows Vista会检查其“父进程”的访问令牌,并根据访问令牌里的Mandatory Label SID进行相应的判断:
? 如果是Medium Mandatory Level:则弹出consent对话框要求确认权限的提升。
? 如果是High Mandatory Level:则直接以完全权限打开目标进程,而无需确认。
? 如果是System Mandatory Level:则直接以完全权限打开目标进程,而无需确认。
这里需要注意的是,在Build 5231的Windows Vista版本里,如果按下“ctrl+alt+del”组合键,会直接弹出一个拥有完全权限的任务管理器,因为这时候任务管理器的父进程是winlogon,其Mandatory Label SID为“System Mandatory Level”。

馒头版的UAC

之所以没有给命令行添加所谓的UAC功能,猜想Microsoft考虑到使用命令行的用户大多是IT Pro,在命令行中屏蔽UAC功能,可以有效防止最终用户无意之中运行高危险的命令,例如format、BCDEDIT等,从而避免对系统的毁灭性打击。
尽管如此,笔者还是期待能够看到适用于预命令行的UAC,这里笔者“效颦”胡戈同志的“馒头”巨著,设计一个命令行版本的UAC工作界面,聊搏读者诸公一笑耳。


【ITECN技术专栏】Windows Vista UAC安全功能深入剖析系列之(三)

原文摘自ITECN Blog,作者:盆盆<Microsoft MVP>
原文地址: 点击查看
ITECN Blog是由近40位微软MVP和MCT、还有微软员工组成,旨在宣传微软IT Pro技术

难度 Level300
简介 本文详细介绍了UAC的应用程序标识、安全桌面和虚拟重定向等底层原理,并给出不能禁用UAC的若干理由。更重要的是,本文还将就用户广为关心的文件操作问题提出比较巧妙的解决方案(既能解决文件操作的麻烦,又能保留UAC的安全性);同时本文还为讨厌UAC功能的朋友提供了两个妥协折衷的方法,可以临时摆脱UAC功能的“唠叨”,而不需要因噎废食、禁用UAC功能。

我们现在已经知道,在Windows Vista中,使用管理员帐户登录系统,当Winlogon进程收集帐户凭据并交由LSA验证后。LSA会查看该帐户的访问令牌,如果发现里面包含某些高级特权(例如“修改系统时间”)或者高级SID(例如管理员组SID),就会自动创建两个访问令牌,一个是管理员访问令牌(Full Token),另一个是标准用户访问令牌(UAC Token)。

由Winlogon启动的初始化进程userinit链接到标准用户访问令牌,所以由userninit进程启动的Explorer进程也链接到标准用户访问令牌。同样由Explorer启动的用户进程也会自动链接到标准用户访问令牌,由此大大减少受攻击面,极大地提升系统安全性。

如果某个进程需要以更高权限运行,则系统会弹出一个权限提升对话框,确认后即可以更高权限运行该进程,该进程链接到管理员访问令牌

提示 要了解有关UAC进程创建的流程,可以参考MVP Smallfrog的《Windows Vista UAC 模式下的进程创建实战的故事》

五种标识权限提升的方法

Windows Vista并没有一种与生俱来的魔力,可以未卜先知某个应用程序是否应该运行在更高安全级别上。应用程序必须自己想办法通知Windows Vista它需要更高权限。有以下五种方法,让Windows Vista明白该应用程序需要提升权限:

(1) Windows Vista可以智能识别安装程序,例如根据安装程序的文件名(包含install或者setup),还可以智能识别msi发布的安装包等等。可以做一个实验,如果修改其他某个应用程序的名字,例如将QQ.exe重命名为QQInstall.exe,运行它就会自动触发权限提升,原来UAC以为这是一个安装程序。

(2) 在可执行文件的属性对话框、兼容性标签页里勾选“以管理员身份启动该程序”复选框。这等效于在HKCU \Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers注册表分支下添加键值,也相当于修改C:\Windows\AppPatch下的sysmain.sdb兼容性数据库。

(3) 在程序的manifest文件或者内嵌的manifest信息里加入“level=highestAvaible”或者“level requireAdministrator”安全级别。

(4) 鼠标右键单击应用程序,选择“用管理员帐户运行”菜单项。

(5) 利用ACT(应用程序兼容性工具)为特定应用程序创建兼容性数据库,以便IT部门可以方便地在企业里部署兼容性设置。

提示 其中(2)和(3)可以参考笔者的《Windows Vista UAC安全功能深入剖析系列之二》

毁誉参半的安全桌面

大概是从5365 Build起,当系统弹出“用户帐户控制”提升权限对话框时(实际上是consent进程),桌面背景会呈暗色显示,这可能导致某些显示器弹出“无信号”的错误消息,正好可能挡住consent对话框,让这些用户感到非常不便。

1.原理简析

其实这个功能的本意是非常好的,可以增加UAC功能的安全度。原来这个暗色的背景实际上是安全桌面,也就是我们按“Ctrl+Alt+Del”组合键时所看到的蓝色的特殊桌面(上面有类似启动任务管理器等命令)。为什么看到的是暗色的当前桌面呢?原来这是微软为了保持用户体验的一致性,特地对当前桌面做了一个“快照”,将其作为安全桌面的“墙纸”。

由于consent对话框实际运行在安全桌面上(安全桌面运行在session 0上,而用户进程都运行在session 1或者更高的session上),所以安全性非常好。除了少数系统进程外,任何用户进程都无法和consent对话框进行通信,所以恶意程序无法仿冒提升权限对话框以便诱使用户点击。

由于安全桌面的安全性非常好,所以连我们自己都无法直接监控UAC背后发生了什么,同时甚至无法按PrintScreen键进行截图(剪贴板程序无法获得键盘输入)。

2.如何监控UAC底层变化

用常规方法无法对UAC背后的变化进行监控,因为这时候提升权限对话框运行在安全桌面上,用户进程无法与之进行通信,所以我们必须另辟蹊径。

联想到Longhorn Server也具有UAC功能(默认禁用),所以我们可以利用Longhorn Server搭建一个实验环境,用管理员帐户登录进入Session 1,然后借助远程桌面,以另外一个管理员身份登录到这台实验机,进入Session 2。

我们在Session 1里试图运行一个管理任务,这时候系统会提示权限提升。由于安全桌面的原因,这时候无法在Session 1下用Process Explorer访问consent进程的详细信息。

这时候我们可以在远程桌面窗口(Session 2)下打开Process Explorer,可以很方便地查看consent进程的详细信息,如附图所示,我们可以发现consent进程的父进程是svchost(本例的PID是1008),查看这个PID 1008的svchost进程,发现是“Application Information Service”服务的宿主进程。所以可以推测是“Application Information Service”服务启动了consent进程。同时还可以看到consent进程本身运行在Session 1,而不是Session 0。


3.禁用安全桌面

可以用以下方法禁用安全桌面:

(1) 运行secpol.msc,打开“本地安全策略”管理单元窗口。

(2) 在左侧的控制台树中依次展开本地策略、安全选项,在右侧的详细窗格里双击“用户帐户控制:提示提升时切换到安全桌面”策略项。

(3) 在打开的对话框里选中“已禁用”选项,如附图所示。


让UAC停薪留职

不少读者朋友非常讨厌UAC,有时候UAC就像是一位喋喋不休的MM,时不时地打断我们的正常工作。为什么那么多朋友都无法容忍UAC?用户对UAC功能的抱怨大概集中在以下两个方面:

(1) 我已经是管理员了,为什么不直接允许我执行管理任务?如果是第三方应用软件倒也罢了,为什么Windows自带的工具软件都要阻止我?为什么不能让防火墙一样设置规则,让UAC下次不要再提醒?

(2) 为什么转移、删除一个文件都要那么麻烦?

有不少朋友安装好Windows Vista后,第一件事情就是禁用UAC!其实这是一种非常不值得的做法,至少有如下五大理由:

(1) UAC功能是Windows Vista中最大的卖点之一,花费不菲购买了Windows Vista,却把其中最值钱的功能特性给禁用了,这很有点“买椟还珠”的意思。

(2) 如果禁用UAC,则会同时禁用IE保护模式等安全特性,这将大大降低系统的安全性。

(3) 在企业环境里,如果启用UAC,可以减少约40%的桌面相关成本。

(4) 如果禁用了UAC,则当以普通用户登录系统时,无法享受UAC带来的便利(无法方便地安装程序和执行管理任务,也无法享受UAC为遗留应用程序准备的兼容性帮助)。

(5) 强烈推荐正在追MM的GGDD们启用UAC,这可以帮助您提前训练对MM唠叨的抵抗力。

其实从Build 5308、Beta 2,一直到当前最新的5472,UAC功能的进步是有目共睹的,现在UAC的恼人提示已经减少了很多,也增加了很多人性化的改进,UAC功能已经变得越来越平易近人,更多时候,UAC就像一位站在不远处用慈祥目光注视着我们的母亲,而不再是一个在您耳边不停斥责咆哮的上司。

如果您确实讨厌UAC,推荐不要彻底禁用它,而是用以下两种方法将其临时禁用,需要时可以即时恢复。

1.临时摆脱UAC的唠叨—疯狂的石头

(1) 打开任务管理器,切换到“进程”标签页,然后结束“Explorer”进程。

(2) 这时候再单击“显示所有用户的进程”按钮,即可让任务管理器运行在管理员的级别上。

(3) 切换到“应用程序”标签页,单击“新任务”按钮,启动“Explorer”进程,现在新启动的“Explorer”进程运行在管理员级别下。

现在虽然在安全中心里显示UAC启用,如附图所示。但是实际上由于Windows系统的Shell进程Explorer此刻连接的访问令牌是管理员级别的,所以在Windows里启动的任何应用程序都自动继承管理员级别的访问令牌,不受UAC的限制,包括执行管理任务和文件操作。


这时候的UAC功能,光凭“肉眼”很难辨别真伪,说它是假的,安全中心里明明显示启用;说它是真的,但是却不会受到任何限制……

——这不就是疯狂的石头吗?

那么如何才能重新回到UAC状态呢?聪明的您一定想到了,那就是用标准用户权限重新启动Explorer进程:

(1) 首先在任务管理器里中止Explorer进程[记住:这时候任务管理器具有管理员权限],然后关闭任务管理器。

(2) 按“Ctrl+Alt+Del”组合键呼出安全桌面,点击其上的“启动任务管理器”,即可以标准用户权限启动任务管理器,并新建Explorer进程,好了,现在UAC又回来了!

提示 只有在万不得已的情况才使用这种方法,而且推荐仅在该环境里运行管理任务或者进行文件操作时,才用这种方法,至于IE等进程,最好在之前就启动。不过该方法总比彻底禁用UAC功能要好。

2.让UAC闭嘴

如果既希望启用UAC功能,又希望让UAC闭嘴,那么可以通过以下方法修改本地安全策略:

(1) 运行secpol.msc,打开“本地安全策略”管理单元窗口。

(2) 在左侧的控制台树中依次展开本地策略、安全选项,在右侧的详细窗格里双击“用户帐户控制:管理审批模式中管理员的提示提升行为”策略项。

(3) 在打开的对话框里选中“无提示”选项,如附图所示。


这时候UAC的功能还是保持启用状态(可以在安全中心里进行验证),但是当执行管理任务时,系统不再提示确认,而是直接运行。当进行文件操作时,如果遇到权限问题,还是会发出提示,如附图所示,但是单击其上的“继续”按钮,并不会弹出“用户帐户控制”的确认对话框,而是直接完成文件操作。


这种方法的安全性要强于禁用UAC,因为至少这时候IE保护模式等功能还是可以使用的。但是如果一个恶意软件被标记为需要提升权限,那么它同样可以被直接执行。所以为了保证安全性,可以再启用一条比较严厉的策略“用户帐户控制:只提升签名并认证的可执行文件。”这样没有合法数字签名的应用程序将拒绝执行。

提示 仅推荐忍耐力比较差的朋友们使用。

文件操作的噩梦与福音

UAC最为人诟病的就是文件操作的不方便,网上曾流传着这样一个笑话:要彻底删除一个文件,需要花费七个步骤。

其实平心而论,这本不是UAC所造成的问题,恰恰相反,如果理解UAC的本质原理,还会发现UAC其实对文件操作是有帮助的。

何以见得?

原来在Windows安全体系中,用户对文件能够进行什么操作,主要是看Explorer进程的访问令牌和文件的访问控制列表。如果该文件的访问控制列表里规定只有管理员才能执行删除操作,那么处于UAC环境下的用户当然不能直接删除该文件,这是因为这时候Explorer进程的访问令牌中,管理员组的SID被过滤掉了。

这就好比,一个普通用户无法在分区根目录下新建文件,道理是一样的。更何况UAC还给我们提供一个机会提升权限,以便可以进行适当的文件操作。

1.到底谁帮助我们提升了权限?

这里面就带来一个问题(笔者最初也曾疑惑不解),既然文件操作主要是看Explorer进程,但是提升权限后,并没有发现Explorer进程的访问令牌有什么变化,这是为什么?难道这个权限是从天上飞下来的?

经过检查发现,当权限提升以后,系统会启动一个Dllhost进程,该进程的访问令牌是管理员级别的,如附图所示,由这个Dllhost进程代替我们完成文件操作。


2.巧妙解决文件操作问题

在5456、5472这些Build里,文件操作的UAC权限提升已经得到很大程度上的改善,例如现在按Shift+Del组合键,提升权限后,就可以直接彻底删除文件,而不会像以前版本那样,还需要花N多步骤清空回收站。

如果您还是对现在的UAC文件操作不满意,那么以下的解决方法可能堪称完美:

(1) 首先打开“文件夹选项”对话框,切换到“查看”标签页,确保选中“在单独的进程中打开文件夹窗口”,如附图所示。


Windows默认只能启动一个Explorer进程。而这个设置确保可以打开两个独立的Explorer进程,以便我们给新的Explorer进程链接管理员的访问令牌。

(2) 要想进行文件操作,只需右键单击“Windows资源管理器”菜单项,选择“用管理员帐户运行”,现在就可以打开一个以管理员权限运行的资源管理器窗口,在这里我们可以任意进行文件操作,当然前提条件是文件允许管理员组这样做,不会再出现UAC权限提升的提示。

为了方便起见,还可以为这个资源管理器添加一个开始菜单项:

(1) 把Explorer.exe从%windir%中复制到“文档”里,然后在属性对话框、“兼容性”标签页里勾选“以管理员身份启动该程序”复选框。

(4) 鼠标右键单击其Explorer.exe,选择“附到[开始]菜单”命令,即可在开始菜单里添加菜单项,可以将菜单项重命名为“管理员:Windows资源管理器”。

如果打开Process Explorer,就可以发现,现在系统里有了两个Explorer进程,其中一个进程被标识为“中强制级别”(Mandatory Integrity Level为中级),这个就是系统的Shell进程。另一个进程被标识为“高强制级别”,这就是以管理员身份运行的“Windows资源管理器”,如附图所示。


这种方法既可以完美地解决文件操作的麻烦,又可以保留UAC功能。当我们在开始菜单或者快速启动栏里启动IE时,IE照样受UAC和IE保护模式的控制,而不会运行在管理员级别下。这是因为,这时候IE的父进程是“中强制级别”的那个Explorer进程。

虚拟重定向

和IE保护模式一样,UAC也利用兼容重定向实现对遗留应用程序的兼容性,不过两者采用的是彼此独立、互不干涉的两套机制。其原理大致如下:

某个遗留应用程序由于设计上的原因,需要在管理员权限,这些程序往往可能需要在一些“全局”的位置写文件或者注册表位置,这些“全局”的位置包括C:\Windows、C:\Program Files,还有HKEY_LOCAL_MACHINE注册表分支。

由于UAC的作用,这些遗留应用程序运行在标准用户权限下,所以没有权限往这些“全局”的位置写入内容。这时候虚拟重定向功能就起作用了,它可以把这些“全局”位置重定向到per-user的路径,这样就可以欺骗遗留应用程序,让它可以顺利运行在标准用户状态。

1.实例介绍

本文简单介绍文件夹虚拟重定向的实现方法,以记事本为例,此处假设当前登录帐户为Admin,Windows Vista安装在D盘。

(1) 首先必须选择Windows 2000/XP下的记事本,而不是Windows Vista内置的记事本工具。

(2) 打开Windows XP版本的记事本程序, 先确认一下记事本进程的访问令牌,确实是工作在标准用户权限下,如附图所示,也就是说按照道理,记事本不可能对D:\Windows目录有写入权限。


(3) 输入一段内容,然后单击文件、保存,把保存路径设置为D:\Windows,文件名为TestUAC.txt。非常奇怪,保存操作居然没有报错“拒绝访问”。

(4) 打开“我的电脑”,进入D:\Windows文件夹,里面并没有发现TestUAC.txt文件,不过我们在工具栏的最右侧看到了一个“兼容性”按钮。

(5) 单击“兼容性”按钮,即可进入“D:\Users\Admin\AppData\Local\VirtualStore\Windows”目录,可以发现这个目录下有一个TestUAC.txt文件,如附图所示。


在这个过程中,如果用File Monitor进行监控,就会发现,当记事本尝试往D:\Windows目录写入文件时,UAC应该会捕获拒绝访问的权限错误,然后自动启用重定向机制,把这个文本文件重定向(保存)到D:\Users\Admin\AppData\Local\VirtualStore\Windows目录中,如附图所示。


也就是说,UAC会自动把“全局”文件夹位置重定向到“%LocalAppData%\VirtualStore\”目录,这是一个per-user的目录,很显然不同的用户,重定向的目录也有所不同。用户A无法看到用户B的重定向文件。这种隔离对大多数应用程序来说没有什么问题,但是对某些应用程序来说可能存在一些问题,例如某些游戏软件可能要求把游戏得分记录保存在一个公共的位置,以便比较各个玩家的成绩,但是UAC可能会让每个玩家认为只有自己才是最棒的。

据微软的调查结果,UAC的这种兼容性大概能够使得约92%的遗留应用程序可以正常工作在Windows Vista环境下。

2.原理简析

从File Monitor截图中我们还能看到一个熟悉的单词“REPARSE”(重解析),难道它和NTFS文件系统的重解析属性有什么相关吗?其实UAC的兼容重定向是借助一个文件系统的筛选驱动程序(Filter Driver)来实现的,这个驱动的名字是luafv.sys,作为SYSTEM进程的线程在内核模式中加载,如附图所示。


3.配置虚拟重定向

有读者朋友肯定早就想问,为什么这个实验必须借助Windows XP下的记事本?为什么不能用Windows Vista自带的记事本工具?原来Windows Vista自带的记事本工具实际上专门为UAC设计的,不能算是遗留应用程序,所以Windows Vista不会为它开启虚拟重定向功能,如果尝试向“全局”位置写入文件,会直接受到拒绝访问的错误消息。

那么标准到底是什么?Windows Vista凭什么不给自带的记事本开启虚拟重定向兼容特性?

原来秘密就在于程序的manifest信息,Windows Vista自带的记事本程序里嵌入了manifest信息,指定了其安全级别为“asInvoker”,Windows Vista将这类定义了安全级别manifest信息的应用程序,一律视作合格的应用程序,不再对此应用虚拟重定向。

用Process Explorer可以查出,Windows Vista自带的记事本的虚拟重定向标记为“No”,而Windows XP记事本的虚拟重定向标记为“Yes”。再例如QQ原本是可以启用虚拟重定向的,但是在manifest文件(QQ.exe.manifest)里添加以下安全级别信息,如附图所:


再启动QQ后,发现其虚拟重定向标记为“No”,如附图所示。


可以在本地安全策略里指定Windows Vista是否启用虚拟重定向功能,方法是禁用“用户帐户控制:将文件和注册表写入错误指定到每个用户位置”策略项。

提示 可以访问以下链接,以查阅《Windows Vista的UAC功能浅析(一)》:
http://www.vistafans.com/thread-36186-1-1.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用system管理权限
获取全局管理员权限,替换explorer.exe
windows xp之提权
Windows 系统文件资源管理器的命令行参数(如何降权打开程序,如何选择文件)
Making Your Application UAC Aware
Windows 7 32位 (explorer)开始菜单按钮汇总附教程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服