複製鏈接
請複製以下鏈接發送給好友

窗口站

鎖定
交互式的窗口站對用户可見並且能接受來自用户的輸入。
中文名
窗口站
類    型
一個安全對象

目錄

窗口站簡介

一個窗口站是一個安全對象,其中包含一個剪貼板,一系列的全局原子以及一組桌面對象。分配給一個交互式用户登陸會話的交互式窗口站還包含鍵盤,鼠標和顯示設備。所有其它的窗口站對用户都是非交互的,這意味着它們對用户不可見,也不能接受用户輸入。

窗口站桌面

桌面是包含在窗口站中的安全對象,一個桌面有一個邏輯顯示錶面並且包含着窗口,菜單和鈎子;一個windows的窗口站能有多個桌面,僅有可交互的窗口站的桌面能被顯示以及接受用户輸入。在一個可交互的窗口站上,同一時刻僅有一個活動桌面活動桌面也被稱為輸入桌面,是當前顯示給用户並接受用户輸入的桌面。應用程序能夠使用OpenInputDesktop函數來獲得輸入桌面都句柄;具有一定訪問權限都應用程序,還能夠使用SwitchDesktop函數來指定一個不同的輸入桌面;
交互式服務:
交互式服務是一個能和輸入桌面活動桌面)交互的服務。其它的桌面不能夠接收用户的輸入。
交互服務必須運行在 LocalSystem 帳户的上下文中,進行配置後以交互方式運行。在調用CreateService函數時指定dwServeceType參數為SERVICE_INTERACTIVE_PROCESS旗標,服務就能夠被配置為以交互的方式運行。但是,下面的註冊表項包含一個的值NoInteractiveServices,用於控制該 SERVICE_INTERACTIVE_PROCESS 標誌的影響:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
NoInteractiveServices的默認值為0,意味着有SERVICE_INTERACTIVE_PROCESS標誌的服務能以交互的方式運行。當 NoInteractiveServices 值設置為非零值時,在那之後啓動的服務,無論它是否設置了SERVICE_INTERACTIVE_PROCESS,都不能以交互都方式運行;
窗口站和桌面都創建:
系統會自動創建交互式窗口站。 當一個交互式的用户登錄時,系統會將交互式窗口站和用户的登錄會話相關聯。 系統還將為交互式窗口站創建默認輸入桌面
當一個非交互都進程,如win32服務嘗試連接到一個win32(系統)並且進程的登陸會話中並沒有窗口站存在時,Win32 會嘗試為會話創建一個窗口站和桌面。 創建的窗口站的名稱基於該登錄會話標識符並且桌面被命名為"default"。窗口站和桌面的自由訪問列表DACL允許服務的用户賬户擁有如下存取權限:
WindowStation: WINSTA_READATTRIBUTES | WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | STANDARD_RIGHTS_REQUIRED
Desktop: DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_ENUMERATE | STANDARD_RIGHTS_REQUIRED
一個進程能使用CreateWIndowStation函數來創建一個新的窗口站,並調用CreateDeskTop函數創建一個新的桌面
進程和窗口站的連接:
當一個進程第一次調用USER32或GDI32的函數(其它的窗口站或桌面函數),必須轉到win32服務時,進程能夠與窗口站和桌面自動的產生一個連接。Wiin32服務依據下面的規則來判斷窗口站應該和那一個進程連接:
如果進程調用了SetProcessWindowStation函數,它就和函數指定的窗口站連接。
如果進程並沒有調用SetProcessWindowStation函數,它就和從父進程繼承而來的窗口站連接。
如果進程沒有調用SetProcessWindowStation函數,也沒有繼承到窗口站,那麼win32服務嘗試打開MAXIMUM_ALLOWED權限並按如下方式連接一個窗口站:
當創建進程時,如果一個窗口站的名稱在STARTUPINFO結構的lpDeskTop成員中被指定並傳遞給CreateProcess函數,那麼進程就和指定的窗口站連接。否則,如果這個進程在一個交互式用户的登陸會話中運行,進程就和交互式窗口站連接。
如果進程運行在一個非交互的登陸會話中,窗口站命名形式基於登陸會話標識並嘗試去打開窗口站,如果打開失敗是因為這個窗口站不存在,那麼win32嘗試去創建一個窗口站和一個默認的桌面
與窗口站(WindowStation)相關API函數
CreateWindowStation,OpenWindowStation,CloseWindowStation,GetProcessWindowStation,
SetProcessWindowStation,EnumWindowStationProc,EnumWindowStations
桌面(Desktop)相關API函數
CreateDesktop,OpenDesktop,OpenInputDesktop,SwitchDesktop,CloseDesktop,GetThreadDesktop,SetThreadDesktop,EnumDesktopProc,EnumDesktops,EnumDesktopWindows