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