想實現向linux那樣的多個虛擬桌面麼?想知道讓服務程序顯示界面麼?那麼就認證看一下下面的説明吧。
1. 遠程桌面會話
當一個用户登錄到一個開啓了遠程桌面的機器時,便會開始一個該用户的會話。每個會話使用一個唯一的會話ID來標識。由於每個登錄到遠程桌面連接的客户端都得到一個獨立的會話ID, 用户的感覺跟在同時登錄多個機器很相似。例如,一台辦公電腦和一台家庭電腦。
每個遠程桌面會話都被關聯到一個交互窗口站。交互窗口站支持的唯一窗口站名字是"WinSta0"。因而每個會話被關聯到它自己本身的"WinSta0"窗口站。每個窗口站有三個標準的桌面: 登錄桌面,屏保桌面,交互桌面。
與一個會話的交互窗口站關聯的用户被稱作是交互用户。在一個遠程桌面連接客户端裏,除了遠程桌面控制枱的交互用户外,還可以有多個交互用户。
使用WTSGetActiveConsoleSessionId函數可以獲得附加到控制枱的會話的標識。
當一個用户從遠程桌面連接客户端註銷, 這個客户端在遠程桌面會話主機(RD Session Host)服務(也曾叫做終端服務)的會話被刪除並且和這個會話關聯的窗口站和桌面被移除 。不過,由於遠程桌面服務控制枱會話從不刪除,關聯到控制枱會話的窗口站不會刪除。當設置運行在交互用户的安全上下文時,應用程序在遠程桌面服務環境如何表現的效果,也被稱作"RunAs Interactive User"對象活動模式。
2. 窗口站(Station)
每個窗口站包含一個剪貼板,一個原子表,一個或者多個桌面對象。每個窗口站對象都是一個安全對象。當一個窗口站創建時,它被關聯到創建它的進程並且賦給當前的會話。
交互的窗口站, WinSta0 是唯一的一個可以顯示用户界面和接收用户輸入的窗口站。它被賦給交互用户的登錄會話,包括鍵盤,鼠標,顯示設備。其他所有的窗口站都是非交互的,也就説它們不能顯示用户界面,也不能接收用户輸入。
當用户登錄到終端服務運行的機器時,這個用户的會話開始。每個會話都關聯到它自己的交互窗口站。
系統會自動創建交互的窗口站(station)。當交互用户登錄時,系統將交互窗口站與登錄會話相關聯。系統也會給默認的交互窗口站創建默認的輸入桌面。由登錄用户啓動的進程被關聯到桌面(Winsta0\default)。
進程可以使用CreateWindowStation函數來建立一個新的窗口站,使用CreateDesktop或者 CreateDesktopEx函數來創建新桌面。可以創建的桌面數量受到系統桌面堆的大小的限制。
當非交互進程(比如服務應用)試圖連接到一個窗口站並且該登錄會話還沒有窗口站存在時,系統將嘗試給這個會話創建窗口站。創建的窗口站的名字是根據登錄會話的標識,而桌面被命名為default, 如下描述:
如果服務是運行在LocalSystem帳號的安全上下文下,但是不包括SERVICE_INTERACTIVE_PROCESS屬性。那麼這個窗口站為非交互,所以這個服務不能顯示用户界面。另外,這個服務創建的進程也不能顯示用户界面。
如果服務是運行在普通用户帳號的安全山下文下,窗口站的名字是根據用户SID Service-0xZ1-Z2$, 其中Z1是登錄SID的高位部分而Z2是SID的低位部分。由於SID對登錄會話來説是唯一的,兩個運行在相同的安全上下文的服務使用唯一的窗口站。這些窗口站是非交互的。
3. 桌面(Desktop)
桌面是邏輯的顯示面且包含用户接口對象比如窗口,菜單,鈎子;桌面可以用於創建和管理窗口。每個桌面對象是一個安全對象。桌面建立時,它被關聯到調用進程的當前的窗口站並賦給調用的線程。
窗口消息只能發送給在同一個桌面的進程。特別的,運行在制定桌面的進程的鈎子過程能只接受到在同相同桌面創建的窗口的所希望的消息。
與交互窗口站(WinSta0)關鍵的那些桌面能用於顯示用户界面並接受用户輸入,但是同一時刻,這些桌面中,只能有一個是活動的。活動桌面,也被稱作輸入桌面,是這些桌面用户當前可見並接收用户輸入的那個。應用程序可以使用OpenInputDesktop函數來獲得輸入桌面的句柄。已經請求訪問的應用程序可以使用SwitchDesktop函數來指定一個不同的輸入桌面。
默認情況下,交互窗口站有三個桌面: Default, ScreenSaver, Winlogon.
默認桌面(Default)是Winlogon啓動第一個登錄的用户進程是創建。就這樣,默認桌面變為活動,並用於與用户交互。
當安全屏幕保護激活時,系統自動撤換到ScreenSaver桌面。通過這樣,保護默認桌面的進程, 防止未合法用户。非安全的屏幕保護運行在Winsta0\Default.
用户剛登錄時,Winlogo桌面是活動的。當Shell指示準備要顯示時或者30秒之後(看那個時間先到),系統撤換到默認桌面。用户會話期間,當用户按下CTRL+ALT+DEL或者用户帳號控制對話框打開,系統撤換到winlogon桌面。
理解: 每個desktop在創建的時候自動有調用者的當前的window station 關聯,並且一旦創建關聯就無法解除的。同樣每個window station創建時自動與進程的遠程桌面會話關聯。
所以標識一個Desktop的方式是: sessionId\WinStaName\DesktopName, 也就是説 session0\WinSta0 跟session1\WinSta0 不是同一個window station。同樣session0\WinSta0\Default 跟session1\WinSta0\Default也不是同一個Desktop。當然了 session0\WinSta0\Default 跟 session0\WinSta1\Default也一樣不是同一個Desktop。這個的sessionid是遠程桌面ID,而不是登錄會話。
附加説明,內容大致是根據msdn的説明翻譯過來的。個人翻譯水平有限,如果不妥,大家就當作笑話看好了。^_^