Windows Vista系统账户保护机制初探( 二 )



虽然我们可以在平时使用权限低的用户名登录 , 但在需要执行特定操作的时候使用runas命令 , 不过这还是有些麻烦 , 同时需要进行的额外操作也太多 。为了解决这一问题 , Vista中提供了UAP功能 。

在介绍这个功能之前 , 我们先了解一下Windows中的各种权限是如何控制的 。这部分主要以单机或工作组环境下的Windows XP Professional为例 , 同时也适用于Windows 2000/2003 , 不适用于Windows 98 。

系统安装好后 , 所有用户的凭据信息(也就是用户名和密码)都被保存在本地SAM(Security Accounts Manager , 安全账户管理器)数据库中 。当用户登录系统时 , 首先要输入用户名和密码 , 这些信息由winlogon进程获取 , 并由LSA(Local Security Authority , 本地安全验证)子系统提交到SAM数据库中验证 。

如果SAM数据库中有符合条件的记录 , 那么LSA子系统就会生成一个访问令牌(Access Token) , 并传递给用户 。当该用户需要运行程序或访问资源的时候 , 系统首先会在用户持有的访问令牌中查找相应的权限信息 , 然后和想要进行的操作所需要具有的权限进行比较 , 如果权限足够 , 那么就可以进行操作;反之操作则会被禁止 。

以运行程序为例 , 当我们试图启动一个程序的时候 , 系统会使用我们的访问令牌来启动程序 , 这样被启动的程序就拥有了和令牌所有者一样的权限 。为了证实这一点 , 我们可以打开Windows任务管理器的进程选项卡 。该选项卡下列出了当前系统中的所有进程 , 每个进程在“用户名”一栏就显示了该进程的“身份” 。


以图1中的几个进程为例 , csRSS.exe是系统进程 , 因此用户名一栏显示的是“SYSTEM”;emeditor.exe是当前登录用户启动的程序 , 因此用户名一栏显示的是当前用户的用户名;eMule.exe虽然也是当前用户启动的 , 不过在启动的时候使用了Runas命令 , 因此看起来该程序就好像其他用户启动的 。当然 , 因为这三个进程使用了不同的访问令牌(也就是用户身份) , 那么这三个程序的权限也就会有所不同 。

进程显示
启用该功能之后 , Vista实际上自动运行在一个被减少了很多特权的安全级别上 。如果因为某些操作 , 系统需要更高的权限 , 就会显示一个对话框 , 并要你输入密码 。这个密码只能用于发起这次请求的操作 , 随后你进行的其他操作 , 哪怕是由此前的操作导致的额外操作 , 全部都是以最低的权限运行的 。

默认情况下UAP是被禁用的 , 要启用该功能 , 在开始菜单中点击“All Programs(所有程序)” , 然后点击“Turn UAP settings On or Off(打开或关闭UAP)” , 你将能看到图2所示界面 , 点击Yes按钮即可打开UAP , 随后我们需要注销并重新登录 。

试试看更改一下系统设置吧 , 例如随便打开控制面板中任何一个控制程序 , 你都将会看到图3所示的对话框 , 要求你输入管理员用户的密码 。

弹出警告框

需要输入管理员密码
有人担心这个功能在启用后会不会造成使用上的不便 , 其实担心是没必要的 , UAP只是一种保护 , 而不是单纯的限制 。假设我们已经启用了UAP功能 , 并要执行某个需要一定特权才能执行的操作 , 例如修改注册表 , 那么可能有两种情况:如果当前登录的账户已经有了修改注册表的权限 , 那么Vista会弹出一个对话框 , 询问用户是否继续该操作 , 用户可以作出选择;如果当前登录的用户没有修改注册表的权限 , Vista会弹出一个对话框 , 告知用户这一情况 , 并允许用户输入一个具有相应权限的账户的用户名和密码 , 验证成功后一样可以进行操作 。

推荐阅读