Windows Vista為什么不允許兩個(gè)用戶同時(shí)登錄
一直就在納悶,為什么Windbg不能轉(zhuǎn)儲(chǔ)完整的WinSta0窗口站的安全描述符?為什么會(huì)少了登錄SID和登錄帳戶的對(duì)應(yīng)ACE?
盆盆很快發(fā)現(xiàn),原來是我自己搞錯(cuò)了。為了方便,我用遠(yuǎn)程桌面連接到另外一臺(tái)實(shí)驗(yàn)用Windows Vista機(jī)器,這時(shí)候由于是遠(yuǎn)程桌面登錄的,拿到的是會(huì)話2。但是我在Windbg里檢查的卻是Sessions1WindowsWindowStationWinSta0。
也就是說,盆盆實(shí)際上是檢查的會(huì)話1里的WinSta0窗口站,而不是遠(yuǎn)程桌面里的WinSta0窗口站(會(huì)話2)!!
難怪檢查出來的結(jié)果,發(fā)現(xiàn)WinSta0窗口站里居然沒有登錄SID和Admin的對(duì)應(yīng)ACE!!
1. 完整的WinSta0安全描述符
為了驗(yàn)證這個(gè)結(jié)果,盆盆重新做實(shí)驗(yàn),這次直接控制臺(tái)登錄(會(huì)話1),再查看WinSta0的安全描述符,果然發(fā)現(xiàn)完整了,有附圖為證!
圖中棕色加粗的部分,就是登錄會(huì)話SID和登錄帳戶Admin所擁有的ACE,這里可以看到登錄會(huì)話SID擁有所有可能的權(quán)限,而Admin則幾乎沒有任何訪問權(quán)限。
問題到這里并沒有結(jié)束。
為什么會(huì)出現(xiàn)先前那篇文章里的錯(cuò)誤?從中可以猜測(cè)到哪些結(jié)論?
2. 為什么只允許一個(gè)交互用戶登錄?
這里盆盆大膽假設(shè)Windows Vista(XP)為什么只能允許一個(gè)交互用戶登錄到系統(tǒng)(包括遠(yuǎn)程桌面)。原來是和WinSta0窗口站的權(quán)限有關(guān)!
當(dāng)新的用戶登錄進(jìn)來后,原來用戶會(huì)話里的WinSta0的安全權(quán)限會(huì)發(fā)生變化,登錄SID和登錄帳戶的ACE(訪問控制項(xiàng))會(huì)被刪除。難怪我們看不到先前登錄用戶的桌面!
可以在遠(yuǎn)程桌面的環(huán)境里打開Process Explorer,查看一個(gè)在先前用戶環(huán)境里打開的進(jìn)程(例如Explorer),可以發(fā)現(xiàn)其句柄列表里沒有WinSta0窗口站,如附圖所示。
從圖中可以看出,當(dāng)前的用戶桌面,會(huì)話2里的Explorer進(jìn)程句柄表里包含WinSta0窗口站,所以可以和用戶進(jìn)行交互;而先前的登錄用戶,會(huì)話1里的Explorer進(jìn)程句柄表里,沒有WinSta0窗口站,所以雖然這些進(jìn)程還在運(yùn)行,但是無法和用戶進(jìn)行交互。
為什么先前的用戶會(huì)話里的進(jìn)程沒有WinSta0的句柄,現(xiàn)在應(yīng)該很明白了,因?yàn)樵摃?huì)話里的WinSta窗口站對(duì)象的ACL定義發(fā)生了變化,現(xiàn)在不再授予登錄會(huì)話SID訪問。
這一切看來和WinSta0窗口站的安全權(quán)限有關(guān)。可見,登錄會(huì)話、窗口站的概念有多重要了。
知道了這個(gè)原因,從理論上,我們可以通過修改先前會(huì)話里的WinSta0窗口站的安全權(quán)限,來突破同一時(shí)刻只能允許一個(gè)用戶交互登錄的限制。但是實(shí)際上沒有那么簡(jiǎn)單,盆盆能夠想到的,微軟肯定早就已經(jīng)想到了。
網(wǎng)上貌似有通過替換一個(gè)文件(termsrv.dll)的方法,讓W(xué)indows Vista支持多個(gè)用戶交互登錄。如果這個(gè)方法能夠成功,其原理必然還是和WinSta0窗口站的權(quán)限有關(guān)。
