每個 Windows 使用者每天都在與 Window Station (視窗站) 與 Desktop (桌面) 互動,但極少開發者直接操作它們。它們是 Windows 物件管理器命名空間中的安全物件 (Securable Object),擁有 DACL、支援存取控制,是服務隔離、多使用者會話、安全桌面 (UAC/Ctrl+Alt+Del)、螢幕保護、遠端桌面的核心基礎。本文從物件層級、安全描述元、進程關聯、API 使用四個維度深度剖析。
STARTUPINFO.lpDesktop 指定或繼承)SwitchDesktop(),切換時其他桌面物件不銷毀、繼續執行Owner SID、Group SID、DACL (Discretionary ACL)、SACL (System ACL)ERROR_ACCESS_DENIED (5)、User32.dll initialization failure、Kernel32.dll initialization failure、退出碼 128 (ERROR_NO_WAIT_CHILDREN)
使用者登入
↓
Winlogon 建立/連接 WinSta0
↓
Winlogon 建立/連接 Winlogon Desktop
↓ (顯示登入 UI)
使用者認證成功
↓
Winlogon 建立/連接 Default Desktop
↓
啟動 Explorer.exe (Shell) 關聯 WinSta0\Default
↓
Explorer 啟動的所有子進程 繼承 WinSta0\Default
Service-0x0-3e7$) + Default DesktopSERVICE_INTERACTIVE_PROCESSDefault 復本) 供服務 UI 顯示STARTUPINFO.lpDesktop
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop; // 格式: "WinSta0\Default" 或 "WinSta0\ScreenSaver" 或 NULL
LPTSTR lpTitle;
DWORD dwX, dwY, dwXSize, dwYSize;
DWORD dwXCountChars, dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput, hStdOutput, hStdError;
} STARTUPINFO;
lpDesktop = NULL:繼承呼叫進程的 Window Station\DesktoplpDesktop = "" (空字串):系統建立新的非互動式 Window Station + Desktop,授予呼叫者完整存取權lpDesktop = "WinSta0\Default":明確指定互動式桌面 (需呼叫者有 WINSTA_ENUMDESKTOPS、DESKTOP_WRITEOBJECTS 等權限)SYSTEM、Administrators、Winlogon 進程 存取| API | 功能 | 常見用途 |
|---|---|---|
| GetProcessWindowStation() | 取得呼叫進程關聯的 Window Station 手柄 | 檢查當前環境 |
| GetUserObjectInformation(hWinSta, UO_NAME, ...) | 取得 Window Station 名稱 | 判斷是否 WinSta0 |
| OpenWindowStation(lpszWinSta, ..., dwDesiredAccess) | 開啟既有 Window Station | 跨進程操作 |
| CreateWindowStation(lpszWinSta, ..., dwDesiredAccess, lpsa) | 建立新 Window Station | 服務隔離、沙箱 |
| SetProcessWindowStation(hWinSta) | 設定呼叫進程關聯 Window Station | 切換環境 (極少用) |
| GetThreadDesktop(dwThreadId) | 取得執行緒關聯 Desktop | UI 執行緒檢查 |
| OpenDesktop(lpszDesktop, ..., dwDesiredAccess) | 開啟既有 Desktop | 切換/枚舉桌面 |
| CreateDesktop(lpszDesktop, ..., dwDesiredAccess, lpsa) | 建立新 Desktop | 隔離 UI、螢幕保護 |
| SetThreadDesktop(hDesktop) | 設定執行緒關聯 Desktop | UI 執行緒綁定 |
| SwitchDesktop(hDesktop) | 切換輸入/顯示至指定 Desktop | Winlogon/Default 切換 |
| CloseDesktop / CloseWindowStation | 關閉手柄 | 資源釋放 |
Window Station 與 Desktop 構成了 Windows 圖形子系統的安全邊界與隔離單元。理解它們的物件層級、DACL 權限、進程關聯繼承、Session 0 Isolation 影響,是開發安全服務、自動化測試基礎設施、沙箱隔離、遠端桌面代理、UAC 整合應用的必修課。下次看到 Ctrl+Alt+Del 畫面切換,請記得:那不只是畫面變了,是 SwitchDesktop(Winlogon Desktop) 在保護你的認證安全。