服务(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.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 下载

穿透Session 0 隔离(一)相关推荐

  1. 解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

    服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的组成部分.我们可以把服务想像成一种特殊的应用程序,它随系统的"开启-关闭"而"开始-停止 ...

  2. 创建用户桌面进程(突破Session 0隔离)

    这里就引入了Windows Vista之后的Session 0隔离机制. 有些服务可能需要在用户界面上显示对话框,或需要与用户的应用程序通讯,这种类型的功能"通常"属于Window ...

  3. C#穿透session隔离———Windows服务启动UI交互程序

    在Windows服务里面启动其他具有界面的应用程序,需要穿透session隔离,尝试了很多种方法,都可行,现在一一列举下来,并写下几个需要注意的地方. 需要注意的地方 首先要将服务的Account属性 ...

  4. 完美解决WebSocket 服务器 The WebSocket session [0] has been closed and no method...异常信息

    最近项目需要web客户端与服务器保持长链接的场景并需要服务器向所有链接的客户端推送消息,于是自然使用了WebSocket技术,自然要考虑到服务器于多个客户端线程安全的问题.于是乎,想当然的在WebSo ...

  5. The WebSocket session [0] has been closed and no method (apart from close()) may be called on a clos

    问题: The WebSocket session [0] has been closed and no method (apart from close()) may be called on a ...

  6. Windows 7 开发系列汇总

    Windows API Code Pack 相关开发 Windows 7 任务栏开发 之 覆盖图标(Overlay Icon) Windows 7 任务栏开发 之 进度条(Progress Bar) ...

  7. 黄聪:使用srvany.exe将任何程序作为Windows服务运行

    srvany.exe是什么? srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说sr ...

  8. Windows服务调用Quartz.net 实现消息调度

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  9. Hook CreateProcess

    6种比较常用的运行(执行)程序的方法: 包括WinExec.ShellExecute.CreateProcess.CreateProcessAsUser.CreateProcessWithLogonW ...

最新文章

  1. 2022-2028年中国数码相机行业投资分析及前景预测报告
  2. 计算机网络相关知识 参考博客 子网掩码怎么理解 网关及网关的作用 路由器基础知识详解
  3. Java 中pdf部分内容加边线_Java 在PDF中添加骑缝章示例解析
  4. 「Apollo」百度Apollo感知模块(perception)红绿灯检测代码完整+详细解析
  5. 变局之际,聊聊物联网的过去、现在和未来
  6. Nordic Collegiate Programming Contest (NCPC) 2016
  7. ArrayList(1.8)
  8. Kubernetes 搭建 Kafka 和 Zookeeper 集群(完整教程)
  9. 北大青鸟c语言课后答案,北大青鸟C语言实现.ppt
  10. 虚幻4地形怎么增加层_虚幻周报20200512 | 该来的总会来的!
  11. VS 下环境覆盖率测试
  12. Java 安装+环境配置(图文详解)
  13. 一眼就吸引人的网名「引人注目」
  14. 获取字符串首字母拼音
  15. 租车汽车租赁管理系统
  16. python2.7安装教程windowsxp_怎么在windows xp 下安装python 2.7
  17. [软件分享]Bandizip(有史以来最好的压缩软件)「v1.0」
  18. 还在死守TCP吗,来看看即将成为HTTP3.0标准协议的QUIC
  19. Log sum inequalit 对数和不等式的证明
  20. Spring Cloud架构教程 (六)消息驱动的微服务【Dalston版】

热门文章

  1. 常用的php开发工具有哪些?
  2. Swift 异常处理
  3. Python 【第十三章】 Django 之 FORM
  4. SQL 交集 差集 并集 笛卡尔积 应用实例
  5. Deep Learning回顾之LeNet、AlexNet、GoogLeNet、VGG、ResNet
  6. C\C++网络编程总结
  7. 『宝藏 状态压缩DP NOIP2017』
  8. django-全文检索
  9. Python(五)列表
  10. 作为一个新人,如何学习嵌入式Linux?