在 Windows XP 和 Windows Server 2003 作業系統,系統的服務 (例如: RPC 服務、IIS 服務、…) 是執行在 Session 0,而在本機直接登入的第一個使用者也是在 Session 0 當中,所以當系統背景的服務如果有顯示訊息視窗時,本機登入的第一個使用者是可以直在桌面上看到這個訊息視窗,這也代表了一件事,本機登入的第一個使用者所執行的程式,是可以直接跟系統背景的服務互相溝通的,萬一使用者執行的是惡意的程式,就非常有可能造成系統損毀。
因此在 Windows Vista 之後,系統的背景服務是在 Session 0 中執行,而所有使用者都在各自獨立的 Session 中執行 (Session 1 之後),這麼一來,就可以保護 Session 0 中的系統服務的安全,但是也造成一些相容性的問題:
- 跨 Session 所建立的物件會失敗
- 使用者無法立即看到服務所顯示的任何視窗畫面
- 如果在 Session 0 中有任何視窗顯示出來,使用者會收到通知,可以切換畫面到 Session 0 的桌面去,看完訊息後再切回自己的桌面。
- 如果真的需要顯示訊息視窗,請使用 WTSSendMessage()
參考資料:
https://msdn.microsoft.com/en-us/library/aa383842(v=vs.85).aspx - 或者使用 CreateProcessAsUser(),然後再從所產生出來的處理程序中顯示訊息視窗
參考資料:
https://msdn.microsoft.com/en-us/library/ms682429(v=vs.85).aspx