在Windows session 0 中,即使没有桌面,我也能获取到桌面,为什么?
In Windows session 0, I was able to get the desktop even though there was no desktop, why?
我能够从 IIS 进程获取 Window 站句柄并使用 GetUserObjectInformation 获取名称“Service-0x0”。
同样,当我从线程中获取桌面句柄并获取名称时,我得到的是“桌面”。
我认为会话 0 的服务中有一个窗口站,没有桌面。
它为什么存在?
IntPtr hWinSta = GetProcessWindowStation();
IntPtr hDesktop = GetThreadDesktop(GetCurrentThreadId());
GetUserObjectInformation(hWinSta, ...
GetUserObjectInformation(hDesktop, ...
桌面还在。它仍然存在的原因是因为它需要创建 windows (HWND) 和各种 API 才能运行(SetWindowsHookEx
等)。 Vista 中添加了 Session 0 隔离,存在太多旧服务无法完全删除 window 站和桌面,这些服务依赖于 USER32 和 GDI32 中的太多功能。
在 Vista 中,如果 Windows 检测到交互式服务需要 UI 输入,您实际上可以 switch to the Session 0 desktop,但我认为当前 Windows 版本中不存在此功能.
我能够从 IIS 进程获取 Window 站句柄并使用 GetUserObjectInformation 获取名称“Service-0x0”。 同样,当我从线程中获取桌面句柄并获取名称时,我得到的是“桌面”。 我认为会话 0 的服务中有一个窗口站,没有桌面。 它为什么存在?
IntPtr hWinSta = GetProcessWindowStation();
IntPtr hDesktop = GetThreadDesktop(GetCurrentThreadId());
GetUserObjectInformation(hWinSta, ...
GetUserObjectInformation(hDesktop, ...
桌面还在。它仍然存在的原因是因为它需要创建 windows (HWND) 和各种 API 才能运行(SetWindowsHookEx
等)。 Vista 中添加了 Session 0 隔离,存在太多旧服务无法完全删除 window 站和桌面,这些服务依赖于 USER32 和 GDI32 中的太多功能。
在 Vista 中,如果 Windows 检测到交互式服务需要 UI 输入,您实际上可以 switch to the Session 0 desktop,但我认为当前 Windows 版本中不存在此功能.