如何从非提升进程以非提升权限运行需管理员权限的程序?
问题背景
我的程序通常需要以提升权限进程启动,因此包含常规清单(...<requestedExecutionLevel level="requireAdministrator"/>...),启动时会弹出UAC提示,这符合预期。
现在我希望在特定条件下,从另一个非提升权限进程中以编程方式将该程序作为非提升权限进程运行(即表现得如同清单中未包含level="requireAdministrator")。
是否可行?
可行方案
是可行的,核心思路是绕过系统对程序嵌入清单的权限校验,直接以非管理员上下文启动目标进程,以下是几种可靠的实现方式:
通过用户令牌启动:
CreateProcessAsUser
从非提升权限进程中,获取当前登录用户的原始非受限令牌(注意不是当前进程的受限令牌),调用CreateProcessAsUserAPI并传入该令牌启动目标程序。这种方式会直接忽略程序自身的清单权限要求,强制以非提升权限运行。临时生成无清单的程序副本
如果程序的权限清单是嵌入在PE文件的资源段中,可以编写代码提取PE文件的可执行主体部分,移除资源段里的清单资源,生成一个临时可执行文件,随后启动这个临时文件。启动完成后可删除临时文件,但需处理文件占用的情况。使用
ShellExecuteEx的默认启动方式
调用ShellExecuteEx时,将lpVerb设为空字符串"",同时正确设置lpDirectory参数,不传入任何与权限提升相关的参数。这种方式依赖系统默认的启动逻辑,部分Windows版本下可能存在兼容性问题,优先推荐前两种方法。
需要注意:执行这些操作的非提升权限进程,需具备对应操作的基础权限,比如生成临时文件需要磁盘写入权限,获取用户令牌需要TOKEN_QUERY等权限。
内容的提问来源于stack exchange,提问作者Jabberwocky

