一、问题引入
获取桌面窗口数据,但是在系统权限且session0下,获取不到非系统权限且session1下的窗口。
二、问题分析
在不同权限的session0和session1下遍历窗口,获取的窗口数据是否存在影响?
三、进程权限
为了系统的安全,Windows系统划分了多种权限来控制用户和程序访问数据的权限,可以有效避免来自病毒的攻击。尤其是在vista系统开始,Windows提供了UAC机制,即使当前登录的用户权限是管理员,运行某些管理员权限的程序或修改需要管理员权限的数据时,系统会弹出一个覆盖桌面的窗口,提示用户是否执行操作或取消操作。那么,为什么管理员账户也会被UAC拦截下来?这里,大概讲解下UAC的内部机制,当系统开启UAC时,如果当前是管理员账户登录,系统会保存一份管理员的token和一份普通权限的token,默认情况下使用普通权限token。如果当前是普通账户登录,系统就保存一份普通权限的token。当运行需要管理员权限或修改管理员权限的数据时,系统就会启动UAC机制,弹出覆盖桌面的弹窗。目前Windows系统提供的权限有:超管(高于系统权限)、系统权限、管理员权限,普通用户权限。不同进程在不同权限范围内各司其职。其中,系统权限及以上的进程(一般为服务进程),运行在session0层,一般是接受不到Windows消息,这就是为什么服务程序没有窗口。
(设置UAC的入口(Vista系统))
四、问题验证:
1、普通权限:
及时其他窗口对应的进程权限是管理员,也可以正常扫描到。
2、管理员权限:
管理员权限下session1层下,扫描到正常的窗口:例如:everything。
3、系统权限:
seesion0层是服务层,不会显示窗口,可以通过debugview查看。系统权限session1层下,扫描的窗口都是系统权限session1的窗口。
四、总结:
对于一些涉及到seesion1层的Windows窗口的功能,比如扫描可见窗口、截图(不涉及驱动层)等不要使用系统权限且session(会话层)不要在服务层,否则可能导致失败。webrtc截屏功能,启动的进程可以是系统权限,但是一定是非session0层。如果有些情况下,进程必须要使用系统权限,但是某些线程功能涉及到管理员权限,这个是可以实现的,但是必须是线程降权,但是不能保证降权后的功能能够正常实现。