在当前用户的上下文中使用来自服务的管理员权限运行ui应用程序

时间:2018-06-08 12:41:13

标签: c# .net windows-services uac

我想创建一项服务。此服务将对当前登录用户的会话进行一些诊断。例如,调用一些WMI命令。如您所知,当您连接到WMI作为服务时,您无法看到特定于用户会话的项目(例如打印机或其他内容)

所以我开始研究,然后我想出了CreateProcessAsUser()(因为我不知道当前用户的密码,这对我来说就好像它会起作用)。

我已成功获得活动会话ID并从会话和重复会话中获取令牌,并将当前登录用户称为进程。但问题是当我打电话给另一个没有提升权利的exe时。我被困在这一点上。

我的问题:

  1. 是否可以以用户身份调用另一个exe但具有管理员权限?

  2. 这是解决这个问题的正确方法吗?我的意思是我读了一些人建议创建2个组件。一个是一些简单的应用程序,它将在用户的上下文中运行,另一个是服务。该服务和小型应用程序将进行通信。

  3. 如果我选择使用2,是否可以使用该服务的管理员权限在用户的上下文中启动这个小应用程序?

  4. 编辑:

    我认为我接近但有点困惑。如果我复制令牌,因为我告诉我获得用户会话但没有管理员权限。但如果我得到链接令牌(因为我读取其管理令牌),而不是重复,我得到它的方式

     IntPtr adminToken = IntPtr.Zero;
     uint TokenInfLength = 0;
     GetTokenInformation(hToken, 
     TOKEN_INFORMATION_CLASS.TokenLinkedToken, adminToken, 
     TokenInfLength,out TokenInfLength);
    

    我的进程以管理员身份运行,但在登录用户的上下文中运行时,它作为系统的上下文运行,我看不到用户特定的数据。我不明白如何将此令牌权限授予当前登录用户

1 个答案:

答案 0 :(得分:0)

有可能你可以使用DuplicateToken功能  然后CreateProcessAsUser使用重复的令牌和提升的权限。

要在服务中工作,此功能需要在本地政策中进行一些更改