在当前用户的上下文中运行具有管理员权限的 ui 应用程序

Posted

技术标签:

【中文标题】在当前用户的上下文中运行具有管理员权限的 ui 应用程序【英文标题】:Run ui application with admin rights from service in current user's context 【发布时间】:2018-06-08 12:41:12 【问题描述】:

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

所以我开始研究并想出了CreateProcessAsUser()(因为我不知道当前用户的密码,这对我来说似乎可以完成这项工作)。

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

我的问题:

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

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

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

编辑:

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

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

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

【问题讨论】:

【参考方案1】:

这是可能的,即您可以使用DuplicateToken 函数 然后CreateProcessAsUser 具有重复的令牌和提升的权限。

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

【讨论】:

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

以上是关于在当前用户的上下文中运行具有管理员权限的 ui 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在Winform程序中设置管理员权限及为用户组添加写入权限

在Winform程序中设置管理员权限及为用户组添加写入权限

在Winform程序中设置管理员权限及为用户组添加写入权限

Linux用户和组管理

C# 使用登录的用户凭据启动进程

linux学习—权限管理