Windows Vista 引入 UIPI (User Interface Privilege Isolation),徹底改變了同一使用者帳戶下進程間的互動規則。過去進程共享相同安全權限,任意發送視窗訊息;現在每個進程附加 完整性層級,低 IL 進程預設無法向高 IL 進程發送視窗訊息、安裝鉤子、注入 DLL——即使它們屬於同一使用者。
管理員登入時獲得兩個 Token:
預設進程用篩選 Token 啟動 (Medium);「以系統管理員身分執行」用完整 Token (High)。同一使用者、同一桌面,卻有不同 IL 的進程共存。
Low < Medium < High < System




低 IL 進程不能對高 IL 進程執行:
SendMessage / PostMessage 到高 IL 視窗SetWindowsHookEx)系統保留一份白名單,以下訊息不受 UIPI 限制:
| 訊息 | 值 | 訊息 | 值 |
|---|---|---|---|
| WM_NULL | 0x000 | WM_MOVE | 0x003 |
| WM_SIZE | 0x005 | WM_GETTEXT | 0x00D |
| WM_GETTEXTLENGTH | 0x00E | WM_GETHOTKEY | 0x033 |
| WM_GETICON | 0x07F | WM_RENDERFORMAT | 0x305 |
| WM_DRAWCLIPBOARD | 0x308 | WM_CHANGECBCHAIN | 0x30D |
| WM_THEMECHANGED | 0x31A | WM_??? (0x313, 0x31B) | - |
ChangeWindowMessageFilter (進程級)// 允許訊息穿越 IL 邊界
ChangeWindowMessageFilter(message, MSGFLT_ADD);
// 移除允許
ChangeWindowMessageFilter(message, MSGFLT_REMOVE);
影響整個進程的所有視窗。
ChangeWindowMessageFilterEx (視窗級)BOOL ChangeWindowMessageFilterEx(
HWND hWnd, // 目標視窗
UINT message, // 訊息 ID
DWORD action, // MSGFLT_ALLOW / MSGFLT_DISALLOW / MSGFLT_RESET
PCHANGEFILTERSTRUCT pChangeFilterStruct // 選擇性,接收詳細結果
);
MSGFLT_ALLOW ≈ MSGFLT_ADD (允許)MSGFLT_DISALLOW ≈ MSGFLT_REMOVE (禁止)MSGFLT_RESET 重置為預設過濾器RegisterWindowMessage 取得的 ID) 呼叫過濾器,勿濫用。ChangeWindowMessageFilterEx 鎖定特定視窗,減少攻擊面。檢視 Integrity Level 欄位即可快速判斷進程 IL,是診斷 UIPI 問題的標準工具。
View → Select Columns → 勾選 Integrity LevelUIPI 是 Windows 防禦深度策略的關鍵一環,透過完整性層級將「使用者身分」與「進程信任度」解耦。開發者需從「同用戶即可互通」的舊思維轉型,採用 IPC 替代視窗訊息,或在必要時精準配置訊息過濾器。Windows 7 的 ChangeWindowMessageFilterEx 提供更細粒度控制,是現代應用程式相容性修復的利器。