我有一个系统服务,它以管理员的身份创建了一个助手交互进程,这样它就可以访问一些与桌面相关的资源,包括BlockInput()函数和NVIDIA的NVAPI函数,这些函数不能从服务中运行。当登录的用户是管理员的成员时,以下操作有效:
- 设置权限级别,包括SE_TCB_NAME
- 使用WTSGetActiveConsoleSessionId()获取活动会话ID
- 使用WTSQueryUserToken()从会话ID获取登录用户
- 使用TokenLinkedToken的GetTokenInformation()
- 具有SecurityImpersonation的DuplicateTokenEx()
- 使用CreateProcessAsUser()启动进程
但是,当我让当前登录的会话成为标准用户而不是管理员中的标准用户时,步骤4。失败,可能是因为标准用户没有与之链接的管理级别令牌。这里的解决方案是什么?我想我需要获得其中一个管理员用户的令牌,但我该怎么做呢?如果该用户不是登录用户,它还能访问与当前桌面交互的功能吗?
您可以复制自己的令牌,然后使用SetTokenInformation
函数更改复制令牌上的会话,将其放入交互式会话中。
正如您所注意到的,不鼓励在交互式会话中以SYSTEM
的身份运行,因为这会给交互式用户提供攻击您的进程的机会,从而可能获得更高的权限。(搜索"粉碎攻击"以获取更多信息。)然而,这种担忧同样适用于在非管理用户会话中以管理用户身份运行的进程。
理想情况下,您应该在交互式会话中使用非管理流程来执行需要交互式会话的功能,同时使用服务来执行需要管理权限的功能。不应该有任何函数同时需要两者,但如果NVAPI违反了这一规则,你就无能为力了
考虑将流程启动到交互式用户会话中专门创建的(并适当保护的)工作站中,以将这种风险降至最低。