【IT168 专稿】甲型H1N1流行,人人谈隔离而色变。好在我们今天谈的不是H1N1的隔离,而是系统服务的Session 0的隔离。
隔离,是为了更好的保护。但是,众所周知的,隔离也会给我们的生活带来一些不便。在Windows 7中,操作系统服务的Session 0隔离,阻断了系统服务和用户桌面进程之间进行交互和通信的桥梁。通过Session 0隔离,虽然可以让操作系统更加安全,但是也给系统服务带来了不少兼容性的问题。
系统服务在Windows 7上遇到的问题
操作系统服务是Windows操作系统中一套完整的机制。服务不同于普通用户程序之处在于,你可以配置服务,让它们从系统启动时开始运行直到系统关闭,而整个过程无需用户参与。操作系统服务负责所有无需用户参与的后台活动,从远程过程调用(PRC)到网络位置识别服务等等。
虽然操作系统服务在执行过程中无需用户参与,但是,有些服务可能需要向用户显示一些用户界面以反馈消息或者是跟用户应用程序进行通信。这种服务在Windows 7中将遇到一些兼容性问题。比如,在Windows 7中,当你的服务尝试向用户显示一个消息对话框时,你将只会看到在任务栏上的一个图标,而无法正常地看到服务想要显示的对话框。确切地讲,你的服务可能会遇到下面这些千奇百怪的问题:
• 虽然服务在运行,但是没干任何它应该干的事情
• 虽然服务在运行,但是其他进程却无法与之通信
• 当你的服务试图通过Windows消息与用户应用程序进行通信时,消息却无法到达应用程序
• 当你的服务试图与桌面进行交互时,仅仅在任务栏上显示一个闪动的图标,无法进行正常的用户交互
以上这些问题,实际上都是因为Windows 7的系统服务Session 0隔离而引起的。这些问题大致可以分为两类:
• 服务无法正确显示用户界面或者仅仅显示一个提示界面
当一个服务想在桌面显示任何用户界面的时候(即使它被容许跟桌面进行交互),一个缓冲层会用“Interactive Service Detection”对话框提示用户,询问是否需要显示来自服务的用户交互界面。虽然用户可以选择继续查看来自服务的用户界面消息,但是,工作流的被中断,使这成为一个严重的应用程序兼容性问题。例如,下面的代码视图在服务中显示一个对话框:
{
// 进入服务循环
while (!g_Stop)
{
DWORD dwResponse = 0;
Sleep(5000);
// 显示对话框
dwResponse = MessageBox(NULL,
L"这是一个从Session 0显示的对话框",
L"Session 0隔离", MB_YESNO);
if (dwResponse == IDNO)
continue; //
//
}
return 0;
}
如果我们在服务属性中,配置服务不可以与桌面进行交互,我们将看不到任何对话框,即使我们在服务中配置它可以与琢磨进行交互,它也会被“Interactive Service Detection”对话框打断,使得工作流被中断。
图1 设置系统服务属性
图2 系统服务显示消息对话框
• 服务和应用程序所共享的对象变得不可见或者是不可访问
当服务创建的对象被一个普通应用程序(以普通用户权限运行)访问的时候,在全局名字空间中将无法找到这个对象(这是因为它是Session 0所私有的)。另外,即使对象是可见的,为了与之通信,其他进程的安全性也要做相应的改变。这将会影响到其他进程,比如普通用户权限运行的应用程序与服务之间的交互。