【问题标题】:Launch process under windows session user when impersonating模拟时在 Windows 会话用户下启动进程
【发布时间】:2014-10-16 20:45:18
【问题描述】:

我有一个可以使用进程模拟运行的桌面应用程序(不是服务)。我通过使用一个单独的应用程序作为启动器来实现这一点,并使用 CreateProcessWithLogonW 在不同的用户下运行应用程序。在用户退出应用程序后,我需要弄清楚如何让应用程序在 Windows 会话用户的凭据下运行启动器进程而不提示输入密码。

我目前的策略是:

  1. 使用 ProcessIdToSessionId 从应用程序进程中获取会话 ID。
  2. 使用 WTSQueryUserToken 从会话 ID 中获取主用户令牌。
  3. 对我不太清楚的事情使用 DuplicateTokenEx。
  4. 使用 CreateProcessAsUser 运行进程。

目前,WTSQueryUserToken 失败,结果为 ERROR_PRIVILEGE_NOT_HELD (http://msdn.microsoft.com/en-us/library/aa383840(v=vs.85).aspx)。有没有其他方法可以获取该令牌?是否有另一种完全可以解决此问题的策略?

另外,我正在使用 C#,并且对 P/Invokes 还很陌生。谢谢

【问题讨论】:

  • 哪个用户正在运行该应用程序以及谁被模拟?您如何识别要模拟的用户?
  • 用户 A 已登录到 windows。应用程序启动器 exe 在用户 A 下运行,用户 B 键入凭据,然后在用户 B 下启动应用程序。然后应用程序需要在用户 A 下启动启动器进程,而无需密码提示。为了检测模拟,我通过 WTSQuerySessionInformation 获取 windows 会话用户的用户名,并将其与 Environment.UserName 属性进行比较。

标签: c# impersonation


【解决方案1】:

您不能在这种情况下使用 WTSQuerUserToken。

来自http://msdn.microsoft.com/en-us/library/aa383840(v=vs.85).aspx

“要成功调用此函数,调用应用程序必须在 LocalSystem 帐户的上下文中运行并具有 SE_TCB_NAME 权限。”

我仍然不明白你有多少 exe,有​​多少进程正在执行,更重要的是为什么。或许你可以更详细地解释一下?

如果原始启动器仍在运行,则向它发送消息并告诉它执行某些操作可能会更简单,而不是从您的模拟进程中启动另一个启动器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多