不调用LogonUser获取未登录用户令牌的实现方式探究
未登录用户令牌的获取方案(非LogonUser实现)
UAC(Appinfo服务)的实现机制
- Appinfo服务(对应进程
svchost.exe -knetsvcs -p -s Appinfo)是UAC提升流程的核心,它获取令牌依赖LsaLogonUser API,而非LogonUser。 - 当你选择“以管理员身份运行”并输入凭据后,Appinfo会通过LsaLogonUser创建全新的交互式登录会话:该API直接与本地安全授权(LSA)层交互,验证凭据有效性后生成包含完整会话上下文的令牌,同时分配新的登录会话ID——这就是你在Process Explorer中看到每次会话ID不同的原因。
- 这种方式不需要目标用户已登录系统,只要凭据合法就能生成令牌,且会话上下文独立于当前用户的登录会话。
PsExec的实现逻辑
- PsExec获取指定用户令牌的核心是CreateProcessWithLogonW API,同样绕开LogonUser。
- 当使用
-u参数指定用户时,PsExec调用CreateProcessWithLogonW验证凭据,直接生成目标用户的令牌并启动进程。该API无需目标用户预先登录,且能创建独立的登录上下文。 - 若要获取系统级令牌,PsExec还会通过
OpenProcessToken打开自身服务进程的令牌进行模拟,但针对普通用户的场景,CreateProcessWithLogonW是主要手段。
为什么不用LogonUser?
LogonUser更偏向网络登录场景,生成的令牌缺乏完整的交互式会话上下文;而LsaLogonUser和CreateProcessWithLogonW属于本地登录专用API,能直接与LSA交互创建包含会话环境、桌面关联等完整信息的令牌,更适合UAC提升、本地进程代跑这类场景。
内容的提问来源于stack exchange,提问作者Mustafa Chelik
相关产品推荐
相关产品推荐

