UAC是什么?
UAC的全称是User Account Control(用户账户控制),它是Windows Vista提供的一个安全特性。它会在用户使用计算机进行更改系统设置或者安装软件等会影响到系统安全性、稳定性的操作时弹出一个对话框,友善的提示用户他们要进行的操作。
当用户使用Windows Vista时,默认是启用UAC的。无论用户以什么身份登录Windows Vista计算机,即使他以管理员的身份登录计算机,都只具有普通用户的权限。当用户执行一些安装操作或者设置操作时,Vista系统会弹出一个对话框,提示用户他们要进行的操作。在这个过程中,如果您使用的是管理员的账号登录Windows Vista,那么只需要点击“Continue”或者“Allow”就可以继续进行操作了。点击的时候,UAC进行了一次权限的提升,这时管理员才是真正具有了管理员的权限。如果是以普通用户登录计算机,当他们执行这样的操作时,Windows Vista会弹出一个对话框,让这个普通用户输入一个管理员的账号和密码。而在以前的Xp系统中,如果我们是普通用户,我们就不可能进行这样的操作,但是在Vista中它也提供了这样的操作,只是你必须知道管理员的账号和密码。
这个功能可以人为的禁用和开启吗?
是可以的,Windows Vista是提供了相关的工具的。
方法一:msconfig.exe 工具
在开始菜单->运行->输入"msconfig" 回车。就会启动msconfig。点击Tools 标签,如图:
msconfig提供了启用、禁用UAC功能的两个选项,选中,然后点击Launch按钮,就设定成功了。启用新的设置需要重新启动计算机。
其实我们可以从该工具执行的命令中,可以看出是通过设定注册表来实现UAC功能的启用和禁用的。
C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLua /t REG_dwORD /d 0 /f
在注册表的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下EnableLUA 键是用来控制UAC功能的启用和暂停,1代表启用UAC功能;0代表禁用UAC功能。这也就不难解释为什么修改UAC设定后,需要重新启动计算机了。
本地安全策略的相关设定:
在开始菜单->运行->输入"secpol.msc" 启动本地安全策略控制台。在"本地安全策略"(Local Policies)节点下"安全选项"(Security Option)子节点中有9个UAC相关的策略。
编程相关
如果您编写的程序需要较高的权限运行,可以为您程序创建一个manifest文件。在manifest文件中加入需要提升权限的描述:
<XML version="1.0" encoding="utf-8">
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="DemoUACApp.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
这样,编译后的程序图标上就会出现那个小盾牌了。我做了一个实验,尝试用程序在系统盘的Program Files文件夹下创建一个子文件夹,并在该文件夹中创建一个普通的文本文件。
实验结果如下:
1) 在app.manifest文件中配置了提升权限的选项。以普通账户运行程序,出现安全提示询问是否运行。点击"允许"后,程序能够正常运行。通过资源浏览器发现Program Files文件夹下新创建的文件夹和文件都存在。符合预期。
2) 删除app.manifest文件,重新编译程序。以普通账户运行程序,未见安全提示。发现程序仍然能够正常运行。但程序新创建的文件夹和文件在资源浏览器中不可见,通过代码仍然能够正常读取新建的文件夹和文件。有点儿出乎意外的说。
既然通过代码能够正常读取,说明文件确实在硬盘上存在。使用Administrator账户登录,发现以Administrator身份浏览文件夹时新创建的文件和文件夹可见。这就有点儿怪了,呵呵。Debug了一下代码,暂未发现在哪部分代码中进行了提权操作。但是,这提示我们如果在编程时不注意UAC问题,有可能会造成未知结果。
小贴士
其实,对于开发人员来说,在Vista下UAC造成的最多的"小麻烦"就是使用Visual Studio 创建Web应用(包括WebApp和WebService)时一定要记得"Run as Administrator",否则会因为权限不够而创建工程失败。或是使用Sql Management Studio Express时因忘了"Run as Administrator"而连不上SQL Server的服务。
您可以打开程序快捷方式的属性对话框,在"快捷方式"标签下有一个"高级按钮",打开后,勾选"Run as Administrator"选项,保存。这样您就可以每次使用鼠标左键单击打开您的Visual Studio创建您的Web应用了。只是每次的"允许"动作依然要有。如图:
感受
UAC总的来说,想法不错。但是,这是建立在用户的"火眼金睛"的基础上的。MS不能要求所有的用户都是程序员、ITPro的水平吧?对于程序员、ITPro来说,Run as Administrator也许是一个警告,但又有几个普通用户看得懂呢?我个人感觉,这个UAC对前几年那种冒用MS名义发出的打Hotfix的欺骗邮件形式的入侵,还是一点儿作用不起。打Hotfix,就要动系统文件,需要Administrator权限也理所应当。可一旦给了安装程序管理员权限,机器照样还是后门大开……