1. 程式人生 > >windows程式設計的偏門概念: 會話(Session), 視窗站(Window Station), 桌面

windows程式設計的偏門概念: 會話(Session), 視窗站(Window Station), 桌面

想實現向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的說明翻譯過來的。個人翻譯水平有限,如果不妥,大家就當作笑話看好了。^_^