首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 穿透 Session 0 隔離(一):原理與現象探究

     編輯:ASP.NET 基礎

緣起:為什麼服務無法彈出視窗?

在 Windows XP 時代,系統服務與使用者應用程式共享同一個 Session 0,服務若勾選「允許服務與桌面互動」,即可直接呼叫 MessageBox.Show 顯示視窗。但自 Windows Vista 起,微軟為了安全性引入 Session 0 隔離:服務獨佔 Session 0,使用者登入後各自分配 Session 1、Session 2…,導致服務無法直接存取使用者桌面。

實驗重現:AlertService 的失敗之旅

建立簡單 Windows 服務

using System.ServiceProcess;
using System.Windows.Forms;

namespace AlertService
{
    public partial class Service1 : ServiceBase
    {
        protected override void OnStart(string[] args)
        {
            MessageBox.Show("來自 AlertService 的訊息。");
        }
    }
}

安裝與設定

  1. 使用 InstallUtil.exe 註冊服務。
  2. 在服務屬性「登入」頁勾選 允許服務與桌面互動。
  3. 啟動服務,觀察工作列閃爍圖示,點選後彈出「檢視訊息」對話框。

InstallUtil 安裝服務

勾選允許服務與桌面互動

工作列閃爍圖示

檢視訊息對話框

關鍵觀察:桌面背景已變

點選「檢視訊息」後出現的訊息方塊,其背景已非 Windows 7 預設桌面,而是經典灰色背景,證明該視窗運行於 Session 0,而非使用者桌面。這也是為何無法直接截圖,必須透過 Virtual PC 才能捕捉該畫面。

Session 0 視窗畫面

Session 0 隔離架構演進

Windows XP / Server 2003:共享 Session 0

服務與應用程式同處 Session 0,權限界限模糊,服務以高權限運行,普通應用程式卻可能被惡意利用,安全風險極高。

XP 時代 Session 0 架構

Windows Vista / 7 / Server 2008 以降:嚴格隔離

  • Session 0 僅載入系統服務與核心驅動程式。
  • 每位登入使用者獲得獨立 Session(Session 1, 2...)。
  • Session 之間預設無法互動,服務無法直接建立 UI、發送訊息至使用者桌面。

Vista 之後 Session 隔離架構

隔離示意圖

驗證程序所在 Session:Process Explorer 實戰

  1. 開啟 Process Explorer(Sysinternals 套件)。
  2. 找到 AlertService.exe,右鍵 Properties → Security 分頁,查看 Session 欄位。
  3. 對比 Outlook.exe 等使用者程式,明顯位於不同 Session。

Process Explorer 查看服務屬性

AlertService 位於 Session 0

Outlook 位於 Session 1

下一步:如何穿透隔離牆?

本文確立了 Session 0 隔離的成因與現象。下一篇將詳細介紹三大主流解決方案:

  • WTSSendMessage:輕量級單向通知。
  • CreateProcessAsUser:在使用者 Session 啟動完整 UI 進程。
  • WCF / Named Pipe / Socket:雙向通訊架構,支援複雜資料交換。

作者:李敬然(Gnie)
出處:GnieTech

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved