WindowStations窗口站?一聽到這個名詞,很多網民覺得一頭霧水,什麼是WindowStations窗口站呢?這是很專業的名詞嗎?我們不需要了解吧,這是很多網友的第一印象,小編告訴你,非也非也.其實, Window stations 和桌面可能是Windows NT服務中最與眾不同的了。絕大多數編程者都不會直接接觸這兩種對象,盡管用戶每時每刻都要碰到它們。window station 和桌面對象就象其它Windows NT對象,如事件、互斥量和信號量一樣,是安全(securable)的。一個window station 對象包括一個剪貼板、一個全局原子集和更多的桌面對象。一個window station或者是可見的或者是不可見的。一個可見的window station接收用戶來自於鼠標或鍵盤的輸入。一個顯示設備也與之相連這樣信息可以顯示給交互式用戶。
在 Windows NT 4.0中,只有一個window station 能被看得到,就是WinSta0。可見的window station也被定義成交互式的。一個不可見的window station是不可交互的,而且也不能接收任何用戶的輸入也沒有顯示設備與之相連。
如前所述,桌面包含在window station對象中。一個桌面對象包含一個邏輯的顯示表面,和窗口、菜單等。只有屬於可見window station的桌面才能被看見並接收用戶的輸入。這個桌面叫做活動桌面。
作為交互式用戶你在不同的時候碰到三種不同的桌面:缺省(Default)、 Winlogon和Screen-saver。Winlogon 桌面是當你按下Ctrl+Alt+Delete組合鍵時顯示在你面前的對話框。缺省(Default)桌面是浏覽器(Explorer)或者是由交互式用戶啟動的所有進程。它更應當被理解成交互式的應用程序桌面。最終的桌面是Screen-saver,它顯示你的屏幕saver。你可能已經注意到可以在不同的桌面之間切換。當一個用戶按下Ctrl+Alt+Delete組合鍵時,操作系統可以從缺省狀態切換到Winlogon桌面。當你在登錄對話框中選擇取消,系統將再切換回缺省桌面。有人問我當切換進行的時候,是否其它桌面上的東西都被破壞掉了,答案是 "不"。雖然你看不到其它桌面,但它們仍然在那裡。
系統中所有的進程都與window station 和桌面相聯系。當一個用戶第一次登錄時,交互式window station, WinSta0,和缺省桌面都與這個用戶的Shell進程相關聯。這樣用戶就能看到shell了,如果不是這樣,用戶是什麼也看不到的。而且在這之後,由shell啟動的所有進程也會和WinSta0 及缺省桌面相關聯。
你還可以通過STARTUPINFO 數據結構的lpDesktop 成員指定你的進程同哪個window station 和桌面相關聯。這個數據結構傳遞給CreateProcess 和 CreateProcessAsUser兩個函數。你可以將lpDesktop 初始化為NULL,意思是讓CreateProcess函數使用和調用進程相同的window station 和桌面。你可以將你自己的window station 和桌面組合定義成"WinSta0\Default" 或者就定義成空字符串。這個參數會讓操作系統為啟動進程創建一個新的不可見的window station 及桌面。與這兩個新對象關聯的安全性授予每個組對它們的完全訪問權限。
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Window stations和桌面是具有安全性的對象。與window station 和桌面將關聯的進程必須由對這些對象的合適的訪問權限。如果進程沒有訪問權,你會看到這兩個消息之一"User32.dll initialization failure(User32.dll初始化失敗)" 或 "Kernel32.dll initialization failure.(Kernel32.dll初始化失敗)"。由進程返回的退出碼為128 或 ERROR_NO_WAIT_CHILDREN。那麼我所指的合適的訪問權是什麼意思呢?假如你有一個文件這樣的對象。你可以為這個文件創建一個DACL以使用戶具有對這個文件的讀訪問權。Window station 和 桌面是以相同的方式工作的。 上一頁12下一頁共2頁
對於一個桌面對象的一個訪問權限叫做DESKTOP_CREATEWINDOW。如果用戶沒有被授予這個訪問權限,任何由這個用戶啟動的進程都不能創建窗口。不幸的是, 象CreateWindow 這樣的USER APIs 在發生同CreateFile 或 CreateMutex API類似的安全問題時,不會返回 "Access Denied(訪問被拒絕)" 消息。User32.dll 中的Windows 應用程序將會被終止,導致DLL初始化錯誤的消息。Kernel32.dll 初始化過程是在創建一個控制板窗口時發生的。一個例程在沒有對window station和桌面的合適的訪問權限的時候啟動cmd.exe。然而不幸的是, CreateProcess 沒有任何機制來檢查這個錯誤。當用戶不具有對window station和桌面的合適訪問權限時,它並不返回一個錯誤信息。CreateProcess將會啟動這個應用程序,然後這個應用程序本身在DLL失敗後終止。
編程人員還可以有一種方法越過"User32.dll initialization failure(User32.dll初始化失敗"消息。系統有一個堆用來為window station分配內存。內存是有限的。缺省設置允許創建七個或八個window station對象。如果你用光了所有的內存,你就會看到這個消息。不過,值得慶幸的是,有一個注冊表關鍵字可以用來增加這個設置。 (參見Knowledge Base article Q142676)
如果你沒在開發服務而只是普通的應用程序,Window stations 和桌面就不是真正的問題。你的應用程序只同交互式桌面WinSta0\Default 相關聯。如果你是在開發一個服務,那麼它可能就會同下面的window station 及桌面組合關聯:
WinSta0\Default
Service-0x0-3e7$\Default
Service Account's Logon SID\Default
WinSta0\Default 同運行在LocalSystem帳戶的,並且與桌面交互的服務關聯 。 (在ServiceType必須指明SERVICE_INTERACTIVE_PROCESS標志)。如果服務不同桌面交互,那麼它是與Service-0x0-3e7$\Default相關聯的。這是個不可見的window station。你一定很疑惑這亂七八糟的0x0-3e7$ 是什麼,它是服務的登錄SID 。登錄SID是獨一無二的。它指的是用戶所屬的組。系統中的所有用戶都會有一個登錄SID。
上一頁12 下一頁共2頁