Windows 会话0无桌面却能获取Desktop句柄的原因是什么?
会话0服务进程存在Desktop对象的核心原因
- Windows的窗口站(Window Station)和桌面(Desktop)是层级绑定的安全对象,所有窗口站必须包含至少一个桌面对象才能被进程/线程关联,这是Win32子系统的强制设计规则,会话0的服务窗口站
Service-0x0也不例外。 - 你观测到的名为
Desktop的对象,就是会话0窗口站的默认桌面:它不关联任何交互式显示设备,也不接收用户输入、不渲染可见界面,仅作为Win32 API执行的必要上下文存在。 - 所有绑定到
Service-0x0窗口站的线程,默认都会关联到这个默认桌面,避免调用依赖桌面上下文的API(比如消息队列相关、窗口创建相关接口)时出现未定义错误。即使你的IIS进程完全没有UI逻辑,这个桌面也是Win32子系统初始化窗口站时自动创建的标准产物,不会占用过多系统资源。 - 补充说明:该桌面下只能创建不可见的消息窗口,仅可用于消息通信,无法创建可见UI,也无法被交互式会话的用户访问,符合会话0隔离的安全设计要求。
你测试用到的API行为完全符合微软官方规范:
IntPtr hWinSta = GetProcessWindowStation(); IntPtr hDesktop = GetThreadDesktop(GetCurrentThreadId()); GetUserObjectInformation(hWinSta, ... GetUserObjectInformation(hDesktop, ...
内容的提问来源于stack exchange,提问作者llscsrl
相关产品推荐
相关产品推荐

