遍历窗口权限问题

一、问题点:获取桌面窗口数据,但是在系统权限且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层。如果有些情况下,进程必须要使用系统权限,但是某些线程功能涉及到管理员权限,这个是可以实现的,但是必须是线程降权,但是不能保证降权后的功能能够正常实现。

原文地址:https://www.cnblogs.com/smartNeo/p/11441562.html

时间: 2024-10-14 20:53:28

遍历窗口权限问题的相关文章

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转) 用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等等之类的.但是什么时候被调用却不知道 了.回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你 提供的地址调用这个函数通知你,并按照预先规定好的形式传

delphi 遍历窗口

function EnumWindowsProc(hwnd: HWND; lparam: LPARAM): Boolean; stdcall; var buf: array[Byte] of Char; begin Result:= True; GetWindowText(hwnd, buf, SizeOf(buf)); Form1.Memo1.Lines.Add(buf); Form1.Memo1.Lines.Add(IntToStr(hwnd)); end; procedure TForm1

循环遍历窗口控件

在做界面的时候,有的时候须要推断控件是否为空,假设窗口就有一个须要推断那无所谓,直接写一个函数调用即可.但是有的时候窗口中须要推断非常多控件,比方说注冊时那么多的信息都须要推断,还有就是组合查询一类的等等一些信息,这时候再用调用函数就显得异常麻烦了,由于每个都须要进行推断,这得反复非常多遍. 当然有问题就有解决方法.由于推断的控件都是来自一个窗口,所以仅仅须要编写一个函数,循环遍历窗口的每个控件即可.详细例如以下: <span style="color:#009900;">

根据获取的窗口句柄遍历窗口Edit控件

网上说遍历窗口控件有两种方法: 1),使用EnumChildWindows,没有深究, 学习网址如下:http://blog.sina.com.cn/s/blog_60ac1c4b010116uj.html 2),使用::FindWindowEx和GetWindow组合 下面只说第二种方法, 首先根据标题获取窗口的句柄, HWND hWnd=::FindWindow(NULL,"zhang001"); findwindow原型: FindWindow(   lpClassName, 

MFC 记录- 遍历窗口

加深记忆------ 经常用到这些,做个记录! 这里列出两种遍历方式... 用到的函数原型: 1 HWND GetWindow( 2 HWND hWnd, // handle to original window 3 UINT uCmd // relationship flag 4 ); 5 6 HWND GetDeskTopWindow(VOID) 7 8 int GetWindowText( 9 HWND hWnd, // handle to window or control with t

]用EnumChildWindows遍历窗口的方法

最近项目有需要,得到一个非自己实现的窗口控件对象.于是想起曾经做过类似功能.总结如下: 调用EnumChildWindows(this->m_hWnd, EnumChildProc, NULL);遍历指定窗口的所有子窗口.这里就是遍历This->m_hWnd的所有子窗口.this从外部窗口继承,外部窗口上的控件就是我们需要查找的对象. 实现BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 的窗口遍历回调函数,其中hwndChi

获得Window窗口权限的三种方法

1.第一种方法:利用视图控制器自带的View的window属性:  具体使用 self.view.window.rootViewController = ... 2.第二种方法:通过导入APPDelegate类来获取window: 具体使用 AppDelegate *app = [UIApplication sharedApplication].delegate; app.window.rootViewController = ... 3.第三种方法:通过UIApplication应用程序的主窗

查找标题已知的窗口句柄,遍历窗口控件句柄

有了回调函数的概念及上面的例子,我们可以继续了.其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow. 其函数原形是: function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以用很多工具获得.如winsignt32. lpWindowName:窗口标题. 调用方式举例: var wndhwnd:HWND; wnd

C++ Win32 遍历窗口

查找指定窗口 #include <iostream> #include <windows.h> using namespace std; int main() { TCHAR szTitle[MAX_PATH] = { 0 }; HWND hWnd = ::FindWindow(L"#32770", L"x32Inject"); if (hWnd != NULL) { // 修改窗口标题 ::SetWindowText(hWnd, L&quo