win7之session理解
服務(Service)對於大家來說一定不會陌生,它是Windows 作業系統重要的組成部分。我們可以把服務想像成一種特殊的應用程式,它隨系統的“開啟~關閉”而“開始~停止”其工作內容,在這期間無需任何使用者參與。
Windows 服務在後臺執行著各種各樣任務,支援著我們日常的桌面操作。有時候可能需要服務與使用者進行資訊或介面互動操作,這種方式在XP 時代是沒有問題的,但自從Vista 開始你會發現這種方式似乎已不起作用。
Session 0 隔離實驗
下面來做一個名叫AlertService 的服務,它的作用就是向用戶發出一個提示對話方塊,我們看看這個服務在Windows 7 中會發生什麼情況。
using System.ServiceProcess; using System.Windows.Forms; namespace AlertService { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { MessageBox
System.ServiceProcess; using System.Windows.Forms; namespace AlertService { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void.Show("A message from AlertService."); } protected override void OnStop() { } } }OnStart(string[] args) { MessageBox.Show("A message from AlertService."); } protected override void OnStop() { } } }
程式編譯後通過Installutil 將其載入到系統服務中:
在服務屬性中勾選“Allow service to interact with desktop” ,這樣可以使AlertService 與桌面使用者進行互動。
在服務管理器中將AlertService 服務“啟動”,這時工作列中會閃動一個圖示:
點選該圖示會顯示下面視窗,提示有個程式(AlertService)正在試圖顯示資訊,是否需要瀏覽該資訊:
嘗試點選“View the message”,便會顯示下圖介面(其實這個介面我已經不能從當前桌面操作截圖了,是通過Virtual PC 截圖的,其原因請繼續閱讀)。注意觀察可以發現下圖的桌面背景已經不是Windows 7 預設的桌面背景了,說明AlertService 與桌面系統的Session 並不相同,這就是Session 0 隔離作用的結果。
Session 0 隔離原理
在Windows XP、Windows Server 2003 或早期Windows 系統時代,當第一個使用者登入系統後服務和應用程式是在同一個Session 中執行的。這就是Session 0 如下圖所示:
但是這種執行方式提高了系統安全風險,因為服務是通過提升了使用者許可權執行的,而應用程式往往是那些不具備管理員身份的普通使用者執行的,其中的危險顯而易見。
從Vista 開始Session 0 中只包含系統服務,其他應用程式則通過分離的Session 執行,將服務與應用程式隔離提高系統的安全性。如下圖所示:
這樣使得Session 0 與其他Session 之間無法進行互動,不能通過服務向桌面使用者彈出資訊視窗、UI 視窗等資訊。這也就是為什麼剛才我說那個圖已經不能通過當前桌面進行截圖了。
Session 檢查
在實際開發過程中,可以通過Process Explorer 檢查服務或程式處於哪個Session,會不會遇到Session 0 隔離問題。我們在Services 中找到之前載入的AlertService 服務,右鍵屬性檢視其Session 狀態。
可看到AlertService 處於Session 0 中:
再來看看Outlook 應用程式:
很明顯在Windows 7 中服務和應用程式是處於不同的Session,它們之間加隔了一個保護牆,在下篇文章中將介紹如何穿過這堵保護牆使服務與桌面使用者進行互動操作。