Windows createprocess以当前登录用户权限(uac降权)运行程序


        近期的工作,总是会碰到一些比较奇特的需求,比如说:在一个以管理员权限运行的程序里面,启动/运行一个非管理员/当前用户权限的程序或者服务之类。

        进程的权限是继承的。一般来说,管理员权限下运行的程序,即便创建新进程或者启动别的程序,被创建或者启动的也依然管理员权限。

=======================================================================

将程序或者进程提权,倒是有许多办法可以实现。比如说调用API ShellExcuteEx( )并指定SHELLEXCUTEINFO的lpVerb为“runas”;比如说在工程文件的manifast里面指定,要求admin权限才能运行;再比如说利用漏洞,当然,这个非常规做法难度太高、风险太大就不在讨论范围内了。

参考此文 https://blog.csdn.net/zuishikonghuan/article/details/46965159 《[Win32] UAC用户账户控制(提权+降权)》

=======================================================================

关于降权,在网上查找的资料,大致可以分为两类。

第一类就是利用当前用户的explorer.exe的token。Windows shell进程explorer.exe本身没有管理员权限。

比较有用的就是这个: https://blog.csdn.net/wanlitengfei/article/details/25290435 《win7 createprocess 如何以当前登陆用户身份运行程序》

这篇文章的做法概括起来就是说: 通过遍历进程,用OpenProcess和OpenProcessToken获得explorer.exe的token,

然后调用CreateProcessAsUser把之前获得的token作为参数传递进来,创建一个当前登录用户的进程来启动低权限的程序。

========================================================================

第二类则是利用Windows的task shecduler创建一个任务,并让该任务立即执行。

参见文章 https://www.cnblogs.com/tragicguy/archive/2013/05/30/3603781.html 《UAC权限的提权与降权》的末尾。

========================================================================

最终我们这边是怎么解决的呢,采用的是类似第一种的方案,获取explorer.exe 的token并检查是否当前用户的,

如果不是,继续遍历所有进程,直到拿到当前用户的explorer.exe的token,然后CreateProcess并设定属性,最终实现降权。

详细代码就不贴出来了,可以参考上面两份文章。





你可能感兴趣的:(C/C++)