【问题标题】:Impersonate a thread with user's filtered token使用用户过滤的令牌模拟线程
【发布时间】:2015-03-19 05:10:01
【问题描述】:

我正在编写一个属于自定义公司设置的应用程序。 这个应用程序做了很多任务,其中一些需要提升。

我包含了一个清单,以便在应用启动时 UAC 要求用户提升权限。

其中一项任务是将一些网络驱动器(使用WNetAddConnection)映射到远程服务器。 这些映射应该是持久的。 到目前为止一切顺利,除了当应用关闭时,用户看不到应用刚刚映射的驱动器。

经过一番研究(https://serverfault.com/a/185885/147818),我了解到当用户登录时,它的会话收到 2 个令牌,一个具有低权限,另一个具有完全权限,用于在需要提升时运行进程.

我的问题:我的应用程序是否有可能启动一个线程来获取当前用户过滤的令牌,当应用程序的任务完成时,用户可以在资源管理器中看到网络驱动器?

是否可以使用此令牌模拟线程?

我知道这些可能的解决方法:

  • 重新设计应用程序,以便仅将需要提升的某些特定任务封装在 COM 对象中。
  • 使用EnableLinkedConnections 设置调整注册表(需要重新启动用户的会话)

但由于某些原因,这些解决方案都不是一种选择。

任何帮助将不胜感激

【问题讨论】:

  • 您拒绝的第一个所谓的解决方法看起来不像解决方法。这看起来就像你应该做的那样。
  • 我知道,但你能回答我的问题吗?
  • 而且你不需要 COM。你只需要两个过程。一个升高,另一个不升高。

标签: windows winapi uac local-security-authority


【解决方案1】:

我们在从提升的安装程序映射驱动器时遇到了同样的问题。

我们处理这个问题的方法是,我们首先从安装程序映射驱动器,该安装程序当然在 elevated UAC 状态下运行。安装程序所做的最后一件事是创建一个文本文件,其中列出了驱动器号及其映射的网络驱动器。然后我们运行第二个程序non-elevated,为用户进行映射。这些映射是持久的。

这已经为我们在全球客户机器上安装了数千次。

【讨论】:

  • 感谢您的回答。问题是我们应该只需要分发 1 个 exe 文件。另一件事是:您是否从提升的程序运行第二个程序?
  • 我刚出去阅读我们的代码。我错了。我们以非管理员身份运行一个 .exe,以读取用户手动映射的当前映射驱动器的列表。然后我们运行我们的管理员级 exe 并重新映射它们。但是您的解决方案将是相似的:提升一个进程而一个不提升。您必须弄清楚如何打包它们,以便可以将它们作为一个 exe(可能是压缩的或在安装程序本身中?)并运行它们,以便它们具有正确的 UAC 级别。我知道,整个方法听起来有点复杂,但是一旦你让它工作,它就会很好地工作。
  • 您不需要单独的可执行文件。您可以让一个可执行文件在需要时简单地运行其自身的第二个副本,向其传递命令行参数或其他任何东西,以便它知道它是特定任务的辅助进程。这就是我在不使用 COM 的情况下处理 UAC 提升的方式。我让我的应用程序尽可能地运行 UNELEVATED (requestedElevationLevel=asInvoker),然后使用 ShellExecute/Ex()"runas" 动词仅在需要时运行自身的 ELEVATED 副本。
  • 我修改了应用程序,因此它不再需要运行提升。对于每个可能需要管理员权限的任务,我按照 Remy 的建议使用参数重新启动应用程序本身。谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2021-10-14
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多