Welcome 微信登录
编程资源 图片资源库

首页 / 软件开发 / .NET编程技术 / Windows 7开发:会话 0 隔离 - 白皮书

Windows 7开发:会话 0 隔离 - 白皮书2011-04-18 MSDN Windows 服务的Session 0 隔离机制

服务是整合在Microsoft Windows操作系统中 的结构。服务与用户的应用程序不同,因为你可以对他们进行配置,不需要一个激活的用户 登录,就可以使这些服务在系统启动的时候运行,直到系统关闭。Windows中的服务,负责所 有种类的后台活动,但不包括从远程过程调用(RPC)服务到网络位置服务的用户。

一些服务可能会试图显示一些用户界面对话框,或者与用户的应用程序进行通信。那么这 些服务将会遇到与Windows 7 的兼容性问题。可能你有一个服务,试图显示一个对话框,但 是,可能仅仅是在任务栏中出现一个闪烁的图标。无独有偶,你的服务可能会多多少少遇到 下面的一些现象。这些服务:

• 正在运行,但是没有做他们本希望去做的事情

• 正在运行,但是其 他的一些进程却不能和这个服务进行通信

• 试图通过窗体消息,与用户的应用 程序进行通信,但是窗体消息并没有被目标所接收到

• 在任务栏中,显示一个 闪烁的图标,说明此服务希望与桌面信息进行交互

这些是Windows 7的服务的Session 0隔离机制的一些症状。它们可以大致分为两大类:

• 服务显示用户界面失败, 或者仅仅显示了一个简化的用户界面

当一个服务试图去展示任何有关用户界面的元素 (即使这个服务被允许与桌面信息进行交互),一个叫做Interactive services dialog detection的简单对话框也会弹出,用于提示用户。用户可以进入Session 0的安全桌面中查 看服务的用户界面,但是,工作流中的干扰,使得这个变成了一个严重的应用程序兼容性问 题。

• 很难实现服务和应用程序共享对象,并且这个对象将不可见

当一个对象由服务创建出 来,并且允许标准应用程序访问(以标准用户权限运行),那么这个对象将不能在全局命名 空间中找到(它将被Session 0 中私有)。此外,安全变更,也将保证即使对象是可见的, 但它也是不能被访问的。这些将有可能影响其他的与你的服务进行交互的进程(比如普通用 户的应用程序)。

真正的问题是Windows 7 服务的Session 0 隔离机制

在 Windows XP, Windows Server 2003或者更早期的Windows操作系统中,所有的服务和应用程 序都是运行在与第一个登录到控制台的用户得Session中。这个Session叫做Session 0。在 Session 0 中一起运行服务和用户应用程序,由于服务是以高权限运行的,所以会造成一些 安全风险。这些因素使得一些恶意代理利用这点,来寻找提升他们自身权限的结构。

在Windows Vista中,服务在一个叫做Session 0 的特殊Session中承载。由于应用程序运 行在用户登录到系统后所创建的Session 0 之后的Session中,所以应用程序和服务也就隔离 开来:第一个登录的用户在Session 1中,第二个在Session 2中,以此类推。事实上运行在 不同的Session中,如果没有特别将其放入全局命名空间(并且设置了相应的访问控制配置) ,是不能互相传递窗体消息,共享UI元素或者共享kernel对象。下面的图例中,将进行图解 :

了解更多 关于Session 0 隔离机制,阅读Windows Vista 中的驱动和服务的Session 0 隔离机制的影 响:http://www.microsoft.com/whdc/system/vista/services.mspx