标准用户login时启动pipe理交互式进程

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

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

但是,当我有当前login会话是一个标准的用户而不是pipe理员中的一个,步骤4.失败,大概是因为标准用户没有与它链接的pipe理级别令牌。 这里有什么解决scheme? 我假设我需要得到一个pipe理员用户的令牌,但我该怎么做呢? 如果该用户不是login的用户,它是否仍然可以访问与当前桌面交互的function?

Solutions Collecting From Web of "标准用户login时启动pipe理交互式进程"

您可以复制自己的令牌,然后使用SetTokenInformation函数将重复令牌上的会话更改为交互式会话。

正如你注意到的,在交互式会话中作为SYSTEM运行是不鼓励的,因为它给交互式用户开放攻击你的进程,可能获得更高的权限。 (有关更多信息,请搜索“粉碎攻击”)。但是,这种担心同样适用于在非管理用户会话中作为管理用户运行的进程。

理想情况下,您应该在交互式会话中使用非管理进程来执行需要交互式会话的功能,同时使用服务来执行需要管理权限的功能。 不应该有任何需要这两个功能的功能,但是如果NVAPI打破了这个规则,那么你可以做的不多。

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