注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 配置审核的实施
 帮助

SYSTEM帐户、登录会话和窗口站(三)


2008-04-13 10:39:17
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
盆盆在写上篇文章时,就在纳闷:为什么Windbg不能转储完整的WinSta0窗口站的安全描述符?为什么会少了登录会话SID和登录帐户的对应ACE?

盆盆很快发现,原来是自己的问题。为了方便,直接用远程桌面连接到另外一台实验Windows Vista机器,这时候由于是远程桌面登录的,拿到的是会话2。但是在Windbg里检查的却是\Sessions\1\Windows\WindowStation\WinSta0。

也就是说,
盆盆实际上是检查的会话1里的WinSta0窗口站,而不是远程桌面里的WinSta0窗口站(会话2)!!

难怪检查出来的结果,发现WinSta0窗口站里居然没有登录SID和Admin的对应ACE!!

1. 完整的WinSta0安全描述符

为了验证这个结果,盆盆重新做实验,这次直接控制台登录(会话1),再查看WinSta0的安全描述符,果然发现完整了,有附图为证!


图中棕色加粗的部分,就是登录会话SID和登录帐户Admin所拥有的ACE,这里可以看到登录会话SID拥有所有可能的权限,而Admin则几乎没有任何访问权限。

问题到这里并没有结束。

为什么会出现先前那篇文章里的错误?从中可以猜测到哪些结论?

2. 为什么只允许一个交互用户登录?

这里盆盆大胆假设Windows Vista(XP)为什么只能允许一个交互用户登录到系统(包括远程桌面)。原来是和WinSta0窗口站的权限有关!

当新的用户登录进来后,原来用户会话里的WinSta0的安全权限会发生变化,登录SID和登录帐户的ACE(访问控制项)会被删除。难怪我们看不到先前登录用户的桌面!

可以在远程桌面的环境里打开Process Explorer,查看一个在先前用户环境里打开的进程(例如Explorer),可以发现其句柄列表里没有WinSta0窗口站,如附图所示。


从图中可以看出,当前的用户桌面,会话2里的Explorer进程句柄表里包含WinSta0窗口站,所以可以和用户进行交互;而先前的登录用户,会话1里的Explorer进程句柄表里,没有WinSta0窗口站,所以虽然这些进程还在运行,但是无法和用户进行交互。

为什么先前的用户会话里的进程没有WinSta0的句柄,现在应该很明白了,因为该会话里的WinSta窗口站对象的ACL定义发生了变化,现在不再授予登录会话SID访问。

这一切看来和WinSta0窗口站的安全权限有关。可见,登录会话、窗口站的概念有多重要了。

知道了这个原因,从理论上,我们可以通过修改先前会话里的WinSta0窗口站的安全权限,来突破同一时刻只能允许一个用户交互登录的限制。但是实际上没有那么简单,盆盆既然能够想到,微软肯定早就已经想到了。

网上貌似有通过替换一个文件(termsrv.dll)的方法,让Windows Vista支持多个用户交互登录。如果这个方法能够成功,其原理也许还是和WinSta0窗口站的权限有关。

本文出自 “盆盆” 博客,转载请与作者联系!





    文章评论
 <<   1   2   >>   页数 ( 1/2 )  
2008-04-17 17:57:08
盆盆老大,谢谢关注我的沙龙!借此地道声谢!

2008-04-17 20:32:10
别客气,兄弟,交换一下链接吧,呵呵:)

2008-04-30 00:30:42
Vista把本来已经十分复杂的Windows NT安全模型变得更复杂。
另外Kernel Socket和Display Driver变化也比较大。扩展了几种优先级和调度算法。
楼主是讲Internal的MVP,不知是否清楚MS怎么打算WinFS的?
"窗口站用来保护进程的用户界面" 是“保存”吧?
关于最后的猜测,我记得是和Win32k.sys有关。终端服务早期并没有被考虑在内,实现也不是由12人组完成的。映射Win32k.sys这么个庞然大物是很消耗资源的,所以最终形成了多个版本实现。当然发行的是被限制的版本。

2008-04-30 08:52:34
To Welfear:感谢老大光临!

2008-04-30 15:29:08
http://www.alex-ionescu.com/?p=59

 <<   1   2   >>   页数 ( 1/2 )  

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: