windows - 在 Windows 会话 0 中,即使没有桌面,我也能够获得桌面,为什么?
问题描述
我能够从 IIS 进程中获取 Window Station Handle,并使用 GetUserObjectInformation 获取名称“Service-0x0”。同样,当我从线程中获得桌面句柄并获得名称时,我得到了“桌面”。我认为会话 0 的服务中有一个窗口站,没有桌面。它为什么存在?
IntPtr hWinSta = GetProcessWindowStation();
IntPtr hDesktop = GetThreadDesktop(GetCurrentThreadId());
GetUserObjectInformation(hWinSta, ...
GetUserObjectInformation(hDesktop, ...
解决方案
桌面还在。它仍然存在的原因是因为它需要创建窗口(HWND)和各种 API 才能运行(SetWindowsHookEx
等)。Vista 中添加了 Session 0 隔离,存在太多遗留服务无法完全删除窗口站和桌面,这些服务依赖于 USER32 和 GDI32 中的太多功能。
在 Vista 中,如果 Windows 检测到交互式服务需要 UI 输入,您实际上可以切换到 Session 0 桌面,但我认为当前 Windows 版本中不存在此功能。
推荐阅读
- android - 对齐文本(也就是说,使其适合文本视图并覆盖所有空间)
- python-3.x - 有没有一种保存方法来检索列表的索引而无需尝试捕获?
- firebase - 无法识别的请求类型:Request{com.google.android.gms.tasks.zzu@5843814
- protege - Protege:从属性中创建新类
- redirect - Nginx 301 将 http(裸和 www)重定向到 https www,加上通配符子域到 https
- android - 崩溃 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1)
- python - Tkinter 中的复选框
- python - Sklearn:从 timeSeriesSplit 获取最后一次拆分
- solr - Apache SOLR - 建议者在建议中省略连字符和方括号
- javascript - Node-hid 模块没有在 webworker 上自行注册