一直就在納悶,為什么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窗口站的權限有關。
新聞熱點
疑難解答