【问题标题】:Fall back to default user for child processes after impersonation模拟后回退到子进程的默认用户
【发布时间】:2013-08-01 10:01:43
【问题描述】:

我的应用程序通常由 UserA 作为 UserB 使用 System.Process.Start("app.exe", "UserB", "secret") 启动。

现在,我希望 app.exe 生成额外的子进程,但作为 UserA,没有 UserB 拥有的额外权限。

有没有办法在不询问用户A 的密码的情况下完成此操作?

我尝试在没有凭据的情况下仅使用 System.Process.Start,以及调用 cmd /C child.exe,但两种方法都以 UserB 身份启动 child.exe。我在想一种方法让当前的 shell 为我启动子进程,但我什么也没找到。

【问题讨论】:

  • 我不认为你可以,(如果用户 A 是具有额外权限的用户,那可能会非常危险)
  • 好点。从这个角度来看,我怀疑你是对的。也许app.exe 可以被授予适当的权限。我在那里紧紧地控制着起点,这样我就可以设置它们。如果它们存在。 =)
  • 如果您正在控制该启动,不能在appX(执行启动的那个)和app.exe 之间安排某种反向通道,以便后者可以请求前者(仍以用户 A 身份运行)启动新进程?
  • 可以的,是的。它所涉及的工作比我希望的要多,但这是一个解决方案。为什么不将此作为答案发布?

标签: c# windows impersonation


【解决方案1】:

最简单的解决方案是启动应用程序可以复制自己的安全令牌并允许子进程继承它的句柄。句柄值可以通过命令行或环境变量传递。

请注意,这实际上使用户 B 可以不受限制地访问用户 A 的帐户。

【讨论】:

  • 有趣的想法,谢谢!我不确定如何将句柄传递给子进程,你有提示吗?以某种形式简单地传递 WindowsIdentity.Token 是行不通的(据我所知),因为它只是一个指针,子进程将拥有自己的地址空间,并且无法使用它来访问令牌的内存位置。还是我这里有什么问题? =)
  • 似乎 .NET 对此没有内置支持,因此您必须通过 P/Invoke 使用本机函数。请参阅 DuplicateTokenExSetHandleInformation。我在System.Diagnostics.Process 中没有看到显式控制句柄继承的选项,但它确实支持重定向需要启用继承的输入和输出,所以我猜它要么默认启用,要么仅在您重定向输入或输出时启用.我假设您可以使用 SafeHandle.SetHandle 将导入的句柄带入 .NET 世界。
  • 另外,您可以通过 P/Invoke 启动所有子进程,或者使用本机 DLL 和本机可执行包装器来完成这部分工作。
猜你喜欢
  • 2018-02-01
  • 2023-03-20
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多