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.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,它們之間加隔了一個保護牆,在下篇文章中將介紹如何穿過這堵保護牆使服務與案頭使用者進行互動操作。
Service 下載
作者:李敬然(Gnie)
出處:(http://www.cnblogs.com/gnielee/)