C# 在当前用户';语境

C# 在当前用户';语境,c#,.net,windows-services,uac,C#,.net,Windows Services,Uac,我想创建一个服务。此服务将对当前登录用户的会话执行一些诊断。例如,调用一些WMI命令。正如您所知,当您连接到WMI as服务时,您无法看到特定于用户会话的项目(例如打印机或其他内容) 因此,我开始了我的研究,并提出了CreateProcessAsUser()(因为我不知道当前用户的密码,在我看来这似乎可以完成这项工作) 我已成功获取活动会话id,并从会话和复制会话中获取令牌,并以当前登录用户的身份调用进程。但问题是当我调用另一个exe时,它被调用时没有提升的权限。我在这一点上被绊倒了 我的问题是

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

因此,我开始了我的研究,并提出了
CreateProcessAsUser()
(因为我不知道当前用户的密码,在我看来这似乎可以完成这项工作)

我已成功获取活动会话id,并从会话和复制会话中获取令牌,并以当前登录用户的身份调用进程。但问题是当我调用另一个exe时,它被调用时没有提升的权限。我在这一点上被绊倒了

我的问题是:

  • 是否可以以用户身份调用另一个具有管理员权限的exe

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

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

  • 编辑:

    我想我接近了,但有点困惑。如果我按照我所说的复制令牌,我将获得用户会话,但没有管理员权限。但如果我得到链接令牌(当我读取它的管理令牌时),我会按照下面的方式得到它,而不是重复

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

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

    这是可能的,即您可以使用此功能 然后使用重复的令牌和提升的权限


    要在服务下工作,需要对本地政策进行一些更改

    您好,谢谢您的回答。事实上,这是我已经做过的。进程使用当前登录用户运行,但没有管理员权限。这是我的问题。这个设计正确吗?我应该分离组件吗?@Cozdemir我在过去的项目中有一个运行另一个exe的服务。设计是正确的。据我所知,要使用提升的服务权限运行流程,您应该配置以下策略:作为操作系统的一部分创建令牌对象作为批处理作业登录替换流程级别token@Cozdemir啊,我明白了。请看一下也可能会有帮助。非常感谢。我以前读过,但现在我会再查一遍。我只是不明白当我们以用户(createprocessasuser())的身份启动某些东西时,如果这个用户是标准用户。我们如何授予此用户提升的权限?我不明白示例代码的哪一部分是这样做的。因为这是我的问题,我可以以用户身份启动某些操作,但因为用户是标准的,所以无法执行某些操作。@Cozdemir您的用户必须具有管理员权限,或者您应该具有特权用户的密码。否则这将是一个安全漏洞。