您的位置:首页 > 移动开发

穿透Session 0 隔离(一)(how to use Windows service run a GUI application.)

2014-02-12 14:56 851 查看
转载自:http://www.cnblogs.com/gnielee/archive/2010/04/07/session0-isolation-part1.html

服务(Service)对于大家来说一定不会陌生,它是Windows操作系统重要的组成部分。我们可以把服务想像成一种特殊的应用程序,它随系统的“开启~关闭”而“开始~停止”其工作内容,在这期间无需任何用户参与。

Windows服务在后台执行着各种各样任务,支持着我们日常的桌面操作。有时候可能需要服务与用户进行信息或界面交互操作,这种方式在XP时代是没有问题的,但自从Vista开始你会发现这种方式似乎已不起作用。

Session0隔离实验

下面来做一个名叫AlertService的服务,它的作用就是向用户发出一个提示对话框,我们看看这个服务在Windows7中会发生什么情况。

usingSystem.ServiceProcess;
usingSystem.Windows.Forms;

namespaceAlertService
{
publicpartialclassService1:ServiceBase
{
publicService1()
{
InitializeComponent();
}

protectedoverridevoidOnStart(string[]args)
{
MessageBox.Show("AmessagefromAlertService.");
}

protectedoverridevoidOnStop()
{
}
}
}


程序编译后通过Installutil将其加载到系统服务中:


在服务属性中勾选“Allowservicetointeractwithdesktop”,这样可以使AlertService与桌面用户进行交互。



在服务管理器中将AlertService服务“启动”,这时任务栏中会闪动一个图标:



点击该图标会显示下面窗口,提示有个程序(AlertService)正在试图显示信息,是否需要浏览该信息:



尝试点击“Viewthemessage”,便会显示下图界面(其实这个界面我已经不能从当前桌面操作截图了,是通过VirtualPC截屏的,其原因请继续阅读)。注意观察可以发现下图的桌面背景已经不是Windows7默认的桌面背景了,说明AlertService与桌面系统的Session并不相同,这就是Session0隔离作用的结果。



Session0隔离原理

在WindowsXP、WindowsServer2003或早期Windows系统时代,当第一个用户登录系统后服务和应用程序是在同一个Session中运行的。这就是Session0如下图所示:



但是这种运行方式提高了系统安全风险,因为服务是通过提升了用户权限运行的,而应用程序往往是那些不具备管理员身份的普通用户运行的,其中的危险显而易见。

从Vista开始Session0中只包含系统服务,其他应用程序则通过分离的Session运行,将服务与应用程序隔离提高系统的安全性。如下图所示:



这样使得Session0与其他Session之间无法进行交互,不能通过服务向桌面用户弹出信息窗口、UI窗口等信息。这也就是为什么刚才我说那个图已经不能通过当前桌面进行截图了。



Session检查

在实际开发过程中,可以通过ProcessExplorer检查服务或程序处于哪个Session,会不会遇到Session0隔离问题。我们在Services中找到之前加载的AlertService服务,右键属性查看其Session状态。



可看到AlertService处于Session0中:



再来看看Outlook应用程序:



很明显在Windows7中服务和应用程序是处于不同的Session,它们之间加隔了一个保护墙,在下篇文章中将介绍如何穿过这堵保护墙使服务与桌面用户进行交互操作。

Demo下载:AlertService.zip

作者:李敬然(Gnie)
出处:{GnieTech}(http://www.cnblogs.com/gnielee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: