asp.net中穿透Session 0 隔離(一)
Windows 服務(wù)在后臺執(zhí)行著各種各樣任務(wù),支持著我們?nèi)粘5淖烂娌僮鳌S袝r候可能需要服務(wù)與用戶進(jìn)行信息或界面交互操作,這種方式在XP 時代是沒有問題的,但自從Vista 開始你會發(fā)現(xiàn)這種方式似乎已不起作用。
Session 0 隔離實(shí)驗(yàn)
下面來做一個名叫AlertService 的服務(wù),它的作用就是向用戶發(fā)出一個提示對話框,我們看看這個服務(wù)在Windows 7 中會發(fā)生什么情況。
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 將其加載到系統(tǒng)服務(wù)中:
在服務(wù)屬性中勾選“Allow service to interact with desktop” ,這樣可以使AlertService 與桌面用戶進(jìn)行交互。

在服務(wù)管理器中將AlertService 服務(wù)“啟動”,這時任務(wù)欄中會閃動一個圖標(biāo):
![]()
點(diǎn)擊該圖標(biāo)會顯示下面窗口,提示有個程序(AlertService)正在試圖顯示信息,是否需要瀏覽該信息:

嘗試點(diǎn)擊“View the message”,便會顯示下圖界面(其實(shí)這個界面我已經(jīng)不能從當(dāng)前桌面操作截圖了,是通過Virtual PC 截屏的,其原因請繼續(xù)閱讀)。注意觀察可以發(fā)現(xiàn)下圖的桌面背景已經(jīng)不是Windows 7 默認(rèn)的桌面背景了,說明AlertService 與桌面系統(tǒng)的Session 并不相同,這就是Session 0 隔離作用的結(jié)果。
Session 0 隔離原理
在Windows XP、Windows Server 2003 或早期Windows 系統(tǒng)時代,當(dāng)?shù)谝粋€用戶登錄系統(tǒng)后服務(wù)和應(yīng)用程序是在同一個Session 中運(yùn)行的。這就是Session 0 如下圖所示:
但是這種運(yùn)行方式提高了系統(tǒng)安全風(fēng)險,因?yàn)榉?wù)是通過提升了用戶權(quán)限運(yùn)行的,而應(yīng)用程序往往是那些不具備管理員身份的普通用戶運(yùn)行的,其中的危險顯而易見。
從Vista 開始Session 0 中只包含系統(tǒng)服務(wù),其他應(yīng)用程序則通過分離的Session 運(yùn)行,將服務(wù)與應(yīng)用程序隔離提高系統(tǒng)的安全性。如下圖所示:
這樣使得Session 0 與其他Session 之間無法進(jìn)行交互,不能通過服務(wù)向桌面用戶彈出信息窗口、UI 窗口等信息。這也就是為什么剛才我說那個圖已經(jīng)不能通過當(dāng)前桌面進(jìn)行截圖了。

Session 檢查
在實(shí)際開發(fā)過程中,可以通過Process Explorer 檢查服務(wù)或程序處于哪個Session,會不會遇到Session 0 隔離問題。我們在Services 中找到之前加載的AlertService 服務(wù),右鍵屬性查看其Session 狀態(tài)。
可看到AlertService 處于Session 0 中:
再來看看Outlook 應(yīng)用程序:
很明顯在Windows 7 中服務(wù)和應(yīng)用程序是處于不同的Session,它們之間加隔了一個保護(hù)墻,在下篇文章中將介紹如何穿過這堵保護(hù)墻使服務(wù)與桌面用戶進(jìn)行交互操作。
Service 下載
作者:李敬然(Gnie)
出處:(http://www.cnblogs.com/gnielee/)
相關(guān)文章
簡單使用BackgroundWorker創(chuàng)建多個線程的教程
簡單使用BackgroundWorker創(chuàng)建多個線程的教程,需要的朋友可以參考一下2013-03-03
asp.net實(shí)現(xiàn)將ppt文檔轉(zhuǎn)換成pdf的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)將ppt文檔轉(zhuǎn)換成pdf的方法,通過自定義函數(shù)實(shí)現(xiàn)將pptx格式的文件轉(zhuǎn)換成pdf格式文件的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
.NET?如何使用?OpenTelemetry?metrics?監(jiān)控應(yīng)用程序指標(biāo)
這篇文章主要介紹了.NET?使用?OpenTelemetry?metrics?監(jiān)控應(yīng)用程序指標(biāo),通過代碼演示了如何通過 OpenTelemetry 把 Metrics 的數(shù)據(jù)發(fā)送到 Prometheus 里進(jìn)行查詢與展示,然后又演示了自定義相關(guān)指標(biāo)來滿足業(yè)務(wù)數(shù)據(jù)指標(biāo)的監(jiān)控,需要的朋友可以參考下2024-06-06
如何在ASP.NET Core中使用HttpClientFactory
這篇文章主要介紹了如何在ASP.NET Core中使用HttpClientFactory,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-04-04
asp.net不用設(shè)置iis實(shí)現(xiàn)url重寫 類似偽靜態(tài)路由
說到不用設(shè)置iis,主要是為了實(shí)現(xiàn)在虛擬主機(jī)或是拿不到iis操作限的時候,不能添加isap又想實(shí)現(xiàn)類似于靜態(tài)化的程序?qū)崿F(xiàn)方式,先聲明,這里最終要實(shí)現(xiàn)的效果是,最終可以用12345.html替換show.aspx?id=12345這樣的地址訪問功能,支持任意擴(kuò)展名及無擴(kuò)展2014-01-01
Visual?Studio?2022?MAUI?NU1105(NETSDK1005)?問題處理記錄
某一天修改了幾行代碼后,突然項(xiàng)目無法編譯了,提示NU1105錯誤,這篇文章主要介紹了Visual?Studio?2022?MAUI?NU1105(NETSDK1005)?處理記錄,需要的朋友可以參考下2022-12-12
ASP.NET實(shí)現(xiàn)的生成驗(yàn)證碼功能示例【附demo源碼】
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)的生成驗(yàn)證碼功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了asp.net生成驗(yàn)證碼的原理、步驟與相關(guān)實(shí)現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-07-07

