在标准用户登录时启动管理交互式进程

时间:2014-01-13 18:09:28

标签: windows winapi administrator elevated-privileges createprocessasuser

我有一个系统服务,它以管理员身份创建一个帮助程序交互过程,以便它可以访问一些与桌面相关的资源,包括BlockInput()函数和NVIDIA的NVAPI函数,这些函数无法从服务运行。当登录用户是Administrators的成员时,以下工作:

  1. 设置权限级别,包括SE_TCB_NAME
  2. 使用WTSGetActiveConsoleSessionId()
  3. 获取活动会话ID
  4. 使用WTSQueryUserToken()
  5. 从会话ID登录用户
  6. 使用TokenLinkedToken的GetTokenInformation()
  7. 带有SecurityImpersonation的DuplicateTokenEx()
  8. 使用CreateProcessAsUser()
  9. 启动流程

    但是,当我将当前登录的会话设置为标准用户而不是管理员中的用户时,步骤4会失败,大概是因为标准用户没有与之链接的管理级别令牌。这里有什么解决方案?我假设我需要获得一个管理员用户的令牌,但我该怎么做?如果该用户不是登录的用户,它仍然可以访问与当前桌面交互的功能吗?

1 个答案:

答案 0 :(得分:2)

您可以复制自己的令牌,然后使用SetTokenInformation功能更改复制令牌上的会话,以将其置于交互式会话中。

如您所知,不建议在交互式会话中以SYSTEM身份运行,因为它会让交互式用户有机会攻击您的进程,从而可能获得提升的权限。 (有关详细信息,请搜索“碎片攻击”。)但是,此问题同样适用于在非管理用户会话中作为管理用户运行的进程。

理想情况下,您应该在交互式会话中使用非管理进程,以执行需要交互式会话的功能,同时使用该服务执行需要管理权限的功能。不应该有任何需要两者兼有的功能,但是如果NVAPI违反了这个规则,你就无法做到这一点。

考虑在交互式用户的会话中将流程启动到专门创建的(并且适当安全的)工作站,以便将此风险降至最低。