首页 > 解决方案 > 在 Windows 会话 0 中,即使没有桌面,我也能够获得桌面,为什么?

问题描述

我能够从 IIS 进程中获取 Window Station Handle,并使用 GetUserObjectInformation 获取名称“Service-0x0”。同样,当我从线程中获得桌面句柄并获得名称时,我得到了“桌面”。我认为会话 0 的服务中有一个窗口站,没有桌面。它为什么存在?

IntPtr hWinSta = GetProcessWindowStation();
IntPtr hDesktop =  GetThreadDesktop(GetCurrentThreadId());

GetUserObjectInformation(hWinSta, ...
GetUserObjectInformation(hDesktop, ...

标签: windowsdesktop

解决方案


桌面还在。它仍然存在的原因是因为它需要创建窗口(HWND)和各种 API 才能运行(SetWindowsHookEx等)。Vista 中添加了 Session 0 隔离,存在太多遗留服务无法完全删除窗口站和桌面,这些服务依赖于 USER32 和 GDI32 中的太多功能。

在 Vista 中,如果 Windows 检测到交互式服务需要 UI 输入,您实际上可以切换到 Session 0 桌面,但我认为当前 Windows 版本中不存在此功能。


推荐阅读